From e2c671e9b43d64582ddbda5f05c7d4620509e4e8 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Sat, 14 Jan 2017 17:07:01 -1000 Subject: [PATCH] TCastTo implementation --- DataSpec/DNAMP1/FRME.cpp | 6 +- Runtime/Audio/CDSPAudioPlayer.cpp | 57 ++++++ Runtime/CMakeLists.txt | 10 +- Runtime/CStateManager.cpp | 13 +- Runtime/CStringExtras.hpp | 10 + Runtime/Camera/CCameraManager.cpp | 8 +- Runtime/Camera/CCinematicCamera.cpp | 6 + Runtime/Camera/CCinematicCamera.hpp | 1 + Runtime/Camera/CFirstPersonCamera.cpp | 5 +- Runtime/GameObjectLists.cpp | 19 +- Runtime/MP1/CBeetle.cpp | 6 + Runtime/MP1/CBeetle.hpp | 2 + Runtime/MP1/CNewIntroBoss.cpp | 6 + Runtime/MP1/CNewIntroBoss.hpp | 2 + Runtime/MP1/CSpacePirate.cpp | 7 + Runtime/MP1/CSpacePirate.hpp | 2 + Runtime/MP1/CWarWasp.cpp | 7 + Runtime/MP1/CWarWasp.hpp | 2 + Runtime/MkCastTo.py | 180 ++++++++++++++++++ Runtime/Weapon/CPlasmaProjectile.cpp | 7 + Runtime/Weapon/CPlasmaProjectile.hpp | 2 + Runtime/World/CActor.cpp | 3 +- Runtime/World/CEntity.hpp | 4 +- Runtime/World/CMakeLists.txt | 1 + Runtime/World/CPlayer.cpp | 6 +- Runtime/World/CRepulsor.cpp | 6 + Runtime/World/CRepulsor.hpp | 1 + Runtime/World/CScriptActor.cpp | 7 + Runtime/World/CScriptActor.hpp | 1 + Runtime/World/CScriptActorKeyframe.cpp | 6 + Runtime/World/CScriptActorKeyframe.hpp | 1 + Runtime/World/CScriptActorRotate.cpp | 7 + Runtime/World/CScriptActorRotate.hpp | 2 + Runtime/World/CScriptAiJumpPoint.cpp | 6 + Runtime/World/CScriptAiJumpPoint.hpp | 1 + Runtime/World/CScriptAreaAttributes.cpp | 6 + Runtime/World/CScriptAreaAttributes.hpp | 1 + Runtime/World/CScriptBeam.cpp | 6 + Runtime/World/CScriptBeam.hpp | 1 + Runtime/World/CScriptCameraBlurKeyframe.cpp | 7 + Runtime/World/CScriptCameraBlurKeyframe.hpp | 2 + Runtime/World/CScriptCameraFilterKeyframe.cpp | 7 + Runtime/World/CScriptCameraFilterKeyframe.hpp | 2 + Runtime/World/CScriptCameraHint.cpp | 7 + Runtime/World/CScriptCameraHint.hpp | 2 + Runtime/World/CScriptCameraHintTrigger.cpp | 7 + Runtime/World/CScriptCameraHintTrigger.hpp | 2 + Runtime/World/CScriptCameraPitchVolume.cpp | 8 +- Runtime/World/CScriptCameraPitchVolume.hpp | 1 + Runtime/World/CScriptCameraWaypoint.cpp | 6 + Runtime/World/CScriptCameraWaypoint.hpp | 2 + Runtime/World/CScriptColorModulate.cpp | 7 + Runtime/World/CScriptColorModulate.hpp | 1 + Runtime/World/CScriptCounter.cpp | 6 + Runtime/World/CScriptCounter.hpp | 2 + Runtime/World/CScriptCoverPoint.cpp | 6 + Runtime/World/CScriptCoverPoint.hpp | 1 + Runtime/World/CScriptDamageableTrigger.cpp | 6 + Runtime/World/CScriptDamageableTrigger.hpp | 2 + Runtime/World/CScriptDebris.cpp | 6 + Runtime/World/CScriptDebris.hpp | 2 + Runtime/World/CScriptDistanceFog.cpp | 6 + Runtime/World/CScriptDistanceFog.hpp | 1 + Runtime/World/CScriptDock.cpp | 6 + Runtime/World/CScriptDock.hpp | 1 + Runtime/World/CScriptDockAreaChange.cpp | 8 +- Runtime/World/CScriptDockAreaChange.hpp | 1 + Runtime/World/CScriptDoor.cpp | 12 +- Runtime/World/CScriptDoor.hpp | 1 + Runtime/World/CScriptEffect.cpp | 6 + Runtime/World/CScriptEffect.hpp | 2 + Runtime/World/CScriptGenerator.cpp | 6 + Runtime/World/CScriptGenerator.hpp | 1 + Runtime/World/CScriptGrapplePoint.cpp | 6 + Runtime/World/CScriptGrapplePoint.hpp | 2 + Runtime/World/CScriptHUDMemo.cpp | 6 + Runtime/World/CScriptHUDMemo.hpp | 2 + Runtime/World/CScriptMemoryRelay.cpp | 6 + Runtime/World/CScriptMemoryRelay.hpp | 1 + Runtime/World/CScriptPickup.cpp | 7 + Runtime/World/CScriptPickup.hpp | 2 + Runtime/World/CScriptPickupGenerator.cpp | 6 + Runtime/World/CScriptPickupGenerator.hpp | 1 + Runtime/World/CScriptPlatform.cpp | 7 + Runtime/World/CScriptPlatform.hpp | 2 + Runtime/World/CScriptPointOfInterest.cpp | 6 + Runtime/World/CScriptPointOfInterest.hpp | 1 + Runtime/World/CScriptRandomRelay.cpp | 6 + Runtime/World/CScriptRandomRelay.hpp | 1 + Runtime/World/CScriptRelay.cpp | 8 +- Runtime/World/CScriptRelay.hpp | 1 + Runtime/World/CScriptShadowProjector.cpp | 8 +- Runtime/World/CScriptShadowProjector.hpp | 1 + Runtime/World/CScriptSound.cpp | 6 + Runtime/World/CScriptSound.hpp | 2 + Runtime/World/CScriptSpawnPoint.cpp | 6 + Runtime/World/CScriptSpawnPoint.hpp | 1 + Runtime/World/CScriptSpecialFunction.cpp | 6 + Runtime/World/CScriptSpecialFunction.hpp | 1 + Runtime/World/CScriptStreamedMusic.cpp | 45 +++++ Runtime/World/CScriptStreamedMusic.hpp | 38 ++++ Runtime/World/CScriptSwitch.cpp | 6 + Runtime/World/CScriptSwitch.hpp | 1 + Runtime/World/CScriptTimer.cpp | 6 + Runtime/World/CScriptTimer.hpp | 1 + Runtime/World/CScriptTrigger.cpp | 6 + Runtime/World/CScriptTrigger.hpp | 1 + Runtime/World/CScriptWaypoint.cpp | 6 + Runtime/World/CScriptWaypoint.hpp | 2 + Runtime/World/ScriptLoader.cpp | 18 +- Runtime/World/ScriptLoader.hpp | 2 +- 111 files changed, 766 insertions(+), 35 deletions(-) create mode 100644 Runtime/MkCastTo.py create mode 100644 Runtime/World/CScriptStreamedMusic.cpp create mode 100644 Runtime/World/CScriptStreamedMusic.hpp diff --git a/DataSpec/DNAMP1/FRME.cpp b/DataSpec/DNAMP1/FRME.cpp index 6dfe661b2..a5a0f8be2 100644 --- a/DataSpec/DNAMP1/FRME.cpp +++ b/DataSpec/DNAMP1/FRME.cpp @@ -384,7 +384,11 @@ bool FRME::Extract(const SpecBase &dataSpec, { CAMRInfo::OrthographicProjection* proj = static_cast(info->projection.get()); os.format("cam.type = 'ORTHO'\n" - "cam.ortho_scale = %f\n", std::fabs(proj->right - proj->left)); + "cam.ortho_scale = %f\n" + "cam.clip_start = %f\n" + "cam.clip_end = %f\n", + std::fabs(proj->right - proj->left), + proj->znear, proj->zfar); } else if (info->projectionType == CAMRInfo::ProjectionType::Perspective) { diff --git a/Runtime/Audio/CDSPAudioPlayer.cpp b/Runtime/Audio/CDSPAudioPlayer.cpp index 75fccba55..c7ddc6f2b 100644 --- a/Runtime/Audio/CDSPAudioPlayer.cpp +++ b/Runtime/Audio/CDSPAudioPlayer.cpp @@ -4,6 +4,62 @@ namespace urde { +struct SDSPStreamCacheEntry +{ + std::string x0_fileName; + u32 x10_; + u32 x14_; + float x18_; + float x1c_; + u32 x20_; + float x24_; + bool x28_; +}; + +/* Standard DSPADPCM header */ +struct dspadpcm_header +{ + uint32_t x0_num_samples; + uint32_t x4_num_nibbles; + uint32_t x8_sample_rate; + uint16_t xc_loop_flag; + uint16_t xe_format; /* 0 for ADPCM */ + uint32_t x10_loop_start_nibble; + uint32_t x14_loop_end_nibble; + uint32_t x18_ca; + int16_t x1c_coef[16]; + int16_t x3c_gain; + int16_t x3e_ps; + int16_t x40_hist1; + int16_t x42_hist2; + int16_t x44_loop_ps; + int16_t x46_loop_hist1; + int16_t x48_loop_hist2; + uint16_t x4a_pad[11]; +}; + +struct CDSPStreamManager +{ + dspadpcm_header x0_header; + std::string x60_fileName; // arg1 + union + { + u8 dummy = 0; + struct + { + bool x70_24_claimed : 1; + bool x70_25_ : 1; + u8 x70_26_ : 2; + }; + }; + u8 x71_ = -1; + u8 x72_ = -1; + u8 x73_arg3; + u8 x74_arg4; + u32 x78_handleId; // arg2 + //DVDFileInfo x80_dvdHandle; +}; + struct SDSPStreamInfo { const char* x0_fileName; @@ -13,6 +69,7 @@ struct SDSPStreamInfo u32 x10_; u32 x14_; u32 x18_adpcmOffset; + u32 x1c_; u32 x20_; u32 x24_adpcmCur; diff --git a/Runtime/CMakeLists.txt b/Runtime/CMakeLists.txt index bbc97ac24..344946a83 100644 --- a/Runtime/CMakeLists.txt +++ b/Runtime/CMakeLists.txt @@ -1,4 +1,5 @@ -include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${BOO_INCLUDE_DIR} ${LIBJPEG_INCLUDE_DIR} +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} + ${BOO_INCLUDE_DIR} ${LIBJPEG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/DataSpec ${JBUS_INCLUDE_DIR}) macro(runtime_add_list rel_path a_list) @@ -29,6 +30,11 @@ else() list(APPEND PLAT_SRCS CMemoryCardSysNix.cpp) endif() +add_custom_command(OUTPUT TCastTo.hpp TCastTo.cpp DEPENDS MkCastTo.py + COMMAND python ARGS ${CMAKE_CURRENT_SOURCE_DIR}/MkCastTo.py + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating cast functions") + add_subdirectory(MP1) add_subdirectory(MP2) add_subdirectory(MP3) @@ -97,5 +103,7 @@ add_library(RuntimeCommon CGameHintInfo.hpp CGameHintInfo.cpp rstl.hpp rstl.cpp GameGlobalObjects.hpp GameGlobalObjects.cpp + MkCastTo.py + TCastTo.hpp TCastTo.cpp GCNTypes.hpp ${PLAT_SRCS}) diff --git a/Runtime/CStateManager.cpp b/Runtime/CStateManager.cpp index c8de0d833..275ab5662 100644 --- a/Runtime/CStateManager.cpp +++ b/Runtime/CStateManager.cpp @@ -23,6 +23,7 @@ #include "AutoMapper/CMapWorldInfo.hpp" #include "Particle/CGenDescription.hpp" #include "CMemoryCardSys.hpp" +#include "TCastTo.hpp" #include @@ -143,7 +144,7 @@ CStateManager::CStateManager(const std::weak_ptr& relayTracker, x90c_loaderFuncs[int(EScriptObjectType::ColorModulate)] = ScriptLoader::LoadColorModulate; x90c_loaderFuncs[int(EScriptObjectType::ThardusRockProjectile)] = ScriptLoader::LoadThardusRockProjectile; x90c_loaderFuncs[int(EScriptObjectType::Midi)] = ScriptLoader::LoadMidi; - x90c_loaderFuncs[int(EScriptObjectType::StreamedAudio)] = ScriptLoader::LoadStreamedAudio; + x90c_loaderFuncs[int(EScriptObjectType::StreamedAudio)] = ScriptLoader::LoadStreamedMusic; x90c_loaderFuncs[int(EScriptObjectType::WorldTeleporterToo)] = ScriptLoader::LoadWorldTeleporter; x90c_loaderFuncs[int(EScriptObjectType::Repulsor)] = ScriptLoader::LoadRepulsor; x90c_loaderFuncs[int(EScriptObjectType::GunTurret)] = ScriptLoader::LoadGunTurret; @@ -330,7 +331,7 @@ void CStateManager::TouchPlayerActor() return; #if 0 - CScriptPlayerActor* spa = dynamic_cast(GetObjectById(xf6c_playerActor)); + CScriptPlayerActor* spa = TCastToPtr(GetObjectById(xf6c_playerActor)); if (spa) spa->TouchModels(); #endif @@ -528,12 +529,12 @@ bool CStateManager::ApplyLocalDamage(const zeus::CVector3f& vec1, const zeus::CV float f30 = dt; - CPlayer* player = dynamic_cast(&actor); - CAi* ai = dynamic_cast(&actor); + CPlayer* player = TCastToPtr(&actor); + CAi* ai = TCastToPtr(&actor); #if 0 CDestroyableRock* dRock = nullptr; if (!ai) - dynamic_cast(&actor); + TCastToPtr(&actor); #endif if (player) @@ -620,7 +621,7 @@ void CStateManager::InitializeState(ResId mlvlId, TAreaId aid, ResId mreaId) for (CEntity* ent : *x80c_allObjs) { - CScriptSpawnPoint* sp = dynamic_cast(ent); + CScriptSpawnPoint* sp = TCastToPtr(ent); if (sp && sp->x30_24_active && sp->FirstSpawn()) { const zeus::CTransform& xf = sp->GetTransform(); diff --git a/Runtime/CStringExtras.hpp b/Runtime/CStringExtras.hpp index e0f733e3f..1fa58625f 100644 --- a/Runtime/CStringExtras.hpp +++ b/Runtime/CStringExtras.hpp @@ -22,6 +22,16 @@ public: { return CompareCaseInsensitive(a.c_str(), b.c_str()); } + + static int IndexOfSubstring(const std::string& haystack, const std::string& needle) + { + std::string str = haystack; + std::transform(str.begin(), str.end(), str.begin(), tolower); + std::string::size_type s = str.find(needle); + if (s == std::string::npos) + return -1; + return s; + } }; } diff --git a/Runtime/Camera/CCameraManager.cpp b/Runtime/Camera/CCameraManager.cpp index 0e100ee7a..bb0d2f9ed 100644 --- a/Runtime/Camera/CCameraManager.cpp +++ b/Runtime/Camera/CCameraManager.cpp @@ -12,6 +12,8 @@ #include "GameGlobalObjects.hpp" #include "Graphics/CGraphics.hpp" #include "CObjectList.hpp" +#include "TCastTo.hpp" + namespace urde { float CCameraManager::sAspect = 1.42f; @@ -115,7 +117,7 @@ void CCameraManager::Update(float dt, CStateManager& stateMgr) if (x74_fluidCounter) { - const CScriptWater* water = dynamic_cast(stateMgr.GetObjectById(x78_fluidId)); + const CScriptWater* water = TCastToConstPtr(stateMgr.GetObjectById(x78_fluidId)); if (water) { // TODO: Finish @@ -167,7 +169,7 @@ void CCameraManager::ThinkCameras(float dt, CStateManager& mgr) for (CEntity* ent : gcList) { - CGameCamera* gc = dynamic_cast(ent); + CGameCamera* gc = TCastToPtr(ent); if (gc) { gc->Think(dt, mgr); @@ -179,7 +181,7 @@ void CCameraManager::ThinkCameras(float dt, CStateManager& mgr) return; TUniqueId camId = GetLastCameraId(); - const CGameCamera* cam = dynamic_cast(mgr.GetObjectById(camId)); + const CGameCamera* cam = TCastToConstPtr(mgr.GetObjectById(camId)); if (cam) x3bc_curFov = cam->GetFov(); diff --git a/Runtime/Camera/CCinematicCamera.cpp b/Runtime/Camera/CCinematicCamera.cpp index 816a7c8f8..0253f7edb 100644 --- a/Runtime/Camera/CCinematicCamera.cpp +++ b/Runtime/Camera/CCinematicCamera.cpp @@ -1,4 +1,5 @@ #include "CCinematicCamera.hpp" +#include "TCastTo.hpp" namespace urde { @@ -10,6 +11,11 @@ CCinematicCamera::CCinematicCamera(TUniqueId uid, const std::string& name, const { } +void CCinematicCamera::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CCinematicCamera::ProcessInput(const CFinalInput&, CStateManager& mgr) {} void CCinematicCamera::Reset(const zeus::CTransform&, CStateManager& mgr) {} diff --git a/Runtime/Camera/CCinematicCamera.hpp b/Runtime/Camera/CCinematicCamera.hpp index 7e270ca58..530039765 100644 --- a/Runtime/Camera/CCinematicCamera.hpp +++ b/Runtime/Camera/CCinematicCamera.hpp @@ -12,6 +12,7 @@ public: CCinematicCamera(TUniqueId, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf, bool, float, float, float, float, float, u32); + void Accept(IVisitor& visitor); void ProcessInput(const CFinalInput&, CStateManager& mgr); void Reset(const zeus::CTransform&, CStateManager& mgr); }; diff --git a/Runtime/Camera/CFirstPersonCamera.cpp b/Runtime/Camera/CFirstPersonCamera.cpp index 5fe37e264..84d098cff 100644 --- a/Runtime/Camera/CFirstPersonCamera.cpp +++ b/Runtime/Camera/CFirstPersonCamera.cpp @@ -5,6 +5,7 @@ #include "World/CPlayer.hpp" #include "World/CPlayerCameraBob.hpp" #include "World/CScriptGrapplePoint.hpp" +#include "TCastTo.hpp" #include namespace urde @@ -97,7 +98,7 @@ void CFirstPersonCamera::UpdateTransform(CStateManager& mgr, float dt) if (player->x304_ == 4 || player->x304_ == 1) { - const CActor* act = dynamic_cast(mgr.GetObjectById(player->x310_grapplePointId)); + const CActor* act = TCastToConstPtr(mgr.GetObjectById(player->x310_grapplePointId)); if (act && act->GetMaterialList().Intersection(CMaterialList(EMaterialTypes::Lava)) != 0) { zeus::CVector3f v = player->x318_ - eyePos; @@ -162,7 +163,7 @@ void CFirstPersonCamera::UpdateTransform(CStateManager& mgr, float dt) qGun = zeus::CQuaternion::lookAt(rVec, gunFrontVec, scaledDt * clampedAngle); const CScriptGrapplePoint* gPoint = - dynamic_cast(mgr.GetObjectById(player->x310_grapplePointId)); + TCastToConstPtr(mgr.GetObjectById(player->x310_grapplePointId)); if (gPoint && player->x29c_ > 0.f) { gunFrontVec = x190_gunFollowXf.frontVector(); diff --git a/Runtime/GameObjectLists.cpp b/Runtime/GameObjectLists.cpp index edffa453f..514548a73 100644 --- a/Runtime/GameObjectLists.cpp +++ b/Runtime/GameObjectLists.cpp @@ -6,6 +6,7 @@ #include "World/CScriptAiJumpPoint.hpp" #include "World/CPatterned.hpp" #include "Camera/CGameCamera.hpp" +#include "TCastTo.hpp" namespace urde { @@ -15,7 +16,7 @@ CActorList::CActorList() bool CActorList::IsQualified(const CEntity& ent) { - return static_cast(&ent) != nullptr; + return TCastToConstPtr(ent); } CPhysicsActorList::CPhysicsActorList() @@ -23,7 +24,7 @@ CPhysicsActorList::CPhysicsActorList() bool CPhysicsActorList::IsQualified(const CEntity& ent) { - return static_cast(&ent) != nullptr; + return TCastToConstPtr(ent); } CGameCameraList::CGameCameraList() @@ -31,7 +32,7 @@ CGameCameraList::CGameCameraList() bool CGameCameraList::IsQualified(const CEntity& ent) { - return static_cast(&ent) != nullptr; + return TCastToConstPtr(ent); } CListeningAiList::CListeningAiList() @@ -39,7 +40,7 @@ CListeningAiList::CListeningAiList() bool CListeningAiList::IsQualified(const CEntity& ent) { - return (static_cast(&ent) != nullptr); + return TCastToConstPtr(ent); } CAiWaypointList::CAiWaypointList() @@ -47,8 +48,8 @@ CAiWaypointList::CAiWaypointList() bool CAiWaypointList::IsQualified(const CEntity& ent) { - return static_cast(&ent) != nullptr || - static_cast(&ent) != nullptr; + return TCastToConstPtr(ent) || + TCastToConstPtr(ent); } CPlatformAndDoorList::CPlatformAndDoorList() @@ -61,12 +62,12 @@ bool CPlatformAndDoorList::IsQualified(const CEntity& ent) bool CPlatformAndDoorList::IsDoor(const CEntity& ent) { - return static_cast(&ent) != nullptr; + return TCastToConstPtr(ent); } bool CPlatformAndDoorList::IsPlatform(const CEntity& ent) { - return static_cast(&ent) != nullptr; + return TCastToConstPtr(ent); } CGameLightList::CGameLightList() @@ -74,7 +75,7 @@ CGameLightList::CGameLightList() bool CGameLightList::IsQualified(const CEntity& lt) { - return static_cast(<) != nullptr; + return TCastToConstPtr(lt); } } diff --git a/Runtime/MP1/CBeetle.cpp b/Runtime/MP1/CBeetle.cpp index c07a4a38e..ca87e5d16 100644 --- a/Runtime/MP1/CBeetle.cpp +++ b/Runtime/MP1/CBeetle.cpp @@ -1,6 +1,7 @@ #include "CBeetle.hpp" #include "World/CDamageInfo.hpp" #include "Character/CCharLayoutInfo.hpp" +#include "TCastTo.hpp" namespace urde { @@ -17,5 +18,10 @@ CBeetle::CBeetle(TUniqueId uid, const std::string& name, const CEntityInfo& info } +void CBeetle::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } } diff --git a/Runtime/MP1/CBeetle.hpp b/Runtime/MP1/CBeetle.hpp index 3c61b434b..88599882e 100644 --- a/Runtime/MP1/CBeetle.hpp +++ b/Runtime/MP1/CBeetle.hpp @@ -23,6 +23,8 @@ public: const CPatternedInfo&, CPatterned::EFlavorType,EEntranceType, const CDamageInfo &, const CDamageVulnerability&, const zeus::CVector3f&, float, float, float, const CDamageVulnerability&, const CActorParameters&, const rstl::optional_object); + + void Accept(IVisitor& visitor); }; } } diff --git a/Runtime/MP1/CNewIntroBoss.cpp b/Runtime/MP1/CNewIntroBoss.cpp index 0788e4304..bcc77cb6b 100644 --- a/Runtime/MP1/CNewIntroBoss.cpp +++ b/Runtime/MP1/CNewIntroBoss.cpp @@ -1,5 +1,6 @@ #include "CNewIntroBoss.hpp" #include "Character/CCharLayoutInfo.hpp" +#include "TCastTo.hpp" namespace urde { @@ -15,5 +16,10 @@ CNewIntroBoss::CNewIntroBoss(TUniqueId uid, const std::string& name, const CEnti { } +void CNewIntroBoss::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } } diff --git a/Runtime/MP1/CNewIntroBoss.hpp b/Runtime/MP1/CNewIntroBoss.hpp index 29d1f59ed..f7aa4228b 100644 --- a/Runtime/MP1/CNewIntroBoss.hpp +++ b/Runtime/MP1/CNewIntroBoss.hpp @@ -17,6 +17,8 @@ public: const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo, const CActorParameters& actParms, float, u32, const CDamageInfo& dInfo, u32, u32, u32, u32); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/MP1/CSpacePirate.cpp b/Runtime/MP1/CSpacePirate.cpp index 26dd8d541..63f79a2db 100644 --- a/Runtime/MP1/CSpacePirate.cpp +++ b/Runtime/MP1/CSpacePirate.cpp @@ -1,5 +1,6 @@ #include "CSpacePirate.hpp" #include "Character/CCharLayoutInfo.hpp" +#include "TCastTo.hpp" namespace urde { @@ -12,5 +13,11 @@ CSpacePirate::CSpacePirate(TUniqueId uid, const std::string& name, const CEntity EColliderType::One, EBodyType::One, aParams, true) { } + +void CSpacePirate::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } } diff --git a/Runtime/MP1/CSpacePirate.hpp b/Runtime/MP1/CSpacePirate.hpp index edba8f8eb..bdaa446cd 100644 --- a/Runtime/MP1/CSpacePirate.hpp +++ b/Runtime/MP1/CSpacePirate.hpp @@ -12,6 +12,8 @@ class CSpacePirate : public CPatterned public: CSpacePirate(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, CModelData&&, const CActorParameters&, const CPatternedInfo&, CInputStream&, u32); + + void Accept(IVisitor& visitor); }; } } diff --git a/Runtime/MP1/CWarWasp.cpp b/Runtime/MP1/CWarWasp.cpp index 13326d47a..eddad8411 100644 --- a/Runtime/MP1/CWarWasp.cpp +++ b/Runtime/MP1/CWarWasp.cpp @@ -1,5 +1,6 @@ #include "CWarWasp.hpp" #include "Character/CCharLayoutInfo.hpp" +#include "TCastTo.hpp" namespace urde { @@ -14,6 +15,12 @@ CWarWasp::CWarWasp(TUniqueId uid, const std::string& name, const CEntityInfo& in { } + +void CWarWasp::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } } diff --git a/Runtime/MP1/CWarWasp.hpp b/Runtime/MP1/CWarWasp.hpp index 6d90e04dd..aad844faa 100644 --- a/Runtime/MP1/CWarWasp.hpp +++ b/Runtime/MP1/CWarWasp.hpp @@ -15,6 +15,8 @@ public: const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo, CPatterned::EFlavorType flavor, CPatterned::EColliderType, const CDamageInfo& dInfo1, const CActorParameters&, ResId weapon, const CDamageInfo& dInfo2, ResId particle, u32 w3); + + void Accept(IVisitor& visitor); }; } } diff --git a/Runtime/MkCastTo.py b/Runtime/MkCastTo.py new file mode 100644 index 000000000..b4531466d --- /dev/null +++ b/Runtime/MkCastTo.py @@ -0,0 +1,180 @@ +"Generates TCastTo source files for constexpr-enabled CEntity casts" + +class Namespace: + def __init__(self, name): + self.name = name + +class EndNamespace: + pass + +CENTITY_TYPES = ( + ('CActor', 'World/CActor.hpp'), + ('CPhysicsActor', 'World/CPhysicsActor.hpp'), + ('CGameCamera', 'Camera/CGameCamera.hpp'), + ('CPatterned', 'World/CPatterned.hpp'), + ('CGameLight', 'World/CGameLight.hpp'), + ('CAi', 'World/CAi.hpp'), + ('CCinematicCamera', 'Camera/CCinematicCamera.hpp'), + ('CScriptHUDMemo', 'World/CScriptHUDMemo.hpp'), + ('CScriptCameraHint', 'World/CScriptCameraHint.hpp'), + ('CScriptPickup', 'World/CScriptPickup.hpp'), + ('CScriptRandomRelay', 'World/CScriptRandomRelay.hpp'), + ('CScriptMemoryRelay', 'World/CScriptMemoryRelay.hpp'), + ('CScriptRelay', 'World/CScriptRelay.hpp'), + ('CScriptCameraWaypoint', 'World/CScriptCameraWaypoint.hpp'), + ('CScriptCoverPoint', 'World/CScriptCoverPoint.hpp'), + ('CScriptSpawnPoint', 'World/CScriptSpawnPoint.hpp'), + ('CRepulsor', 'World/CRepulsor.hpp'), + ('CScriptCameraHintTrigger', 'World/CScriptCameraHintTrigger.hpp'), + ('CScriptSwitch', 'World/CScriptSwitch.hpp'), + ('CScriptAiJumpPoint', 'World/CScriptAiJumpPoint.hpp'), + ('CScriptColorModulate', 'World/CScriptColorModulate.hpp'), + ('CScriptCameraPitchVolume', 'World/CScriptCameraPitchVolume.hpp'), + ('CPlayer', 'World/CPlayer.hpp'), + ('CScriptActor', 'World/CScriptActor.hpp'), + ('CScriptWaypoint', 'World/CScriptWaypoint.hpp'), + ('CScriptDoor', 'World/CScriptDoor.hpp'), + ('CScriptActorKeyframe', 'World/CScriptActorKeyframe.hpp'), + ('CScriptTrigger', 'World/CScriptTrigger.hpp'), + ('CScriptSound', 'World/CScriptSound.hpp'), + ('CPlasmaProjectile', 'Weapon/CPlasmaProjectile.hpp'), + ('CScriptCounter', 'World/CScriptCounter.hpp'), + ('CScriptBeam', 'World/CScriptBeam.hpp'), + ('CScriptStreamedMusic', 'World/CScriptStreamedMusic.hpp'), + ('CScriptTimer', 'World/CScriptTimer.hpp'), + ('CScriptEffect', 'World/CScriptEffect.hpp'), + ('CScriptPlatform', 'World/CScriptPlatform.hpp'), + ('CScriptGrapplePoint', 'World/CScriptGrapplePoint.hpp'), + ('CScriptGenerator', 'World/CScriptGenerator.hpp'), + ('CScriptShadowProjector', 'World/CScriptShadowProjector.hpp'), + ('CScriptDock', 'World/CScriptDock.hpp'), + ('CScriptAreaAttributes', 'World/CScriptAreaAttributes.hpp'), + ('CScriptPickupGenerator', 'World/CScriptPickupGenerator.hpp'), + ('CScriptPointOfInterest', 'World/CScriptPointOfInterest.hpp'), + ('CScriptCameraFilterKeyframe', 'World/CScriptCameraFilterKeyframe.hpp'), + ('CScriptCameraBlurKeyframe', 'World/CScriptCameraBlurKeyframe.hpp'), + ('CScriptActorRotate', 'World/CScriptActorRotate.hpp'), + ('CScriptDistanceFog', 'World/CScriptDistanceFog.hpp'), + ('CScriptDamageableTrigger', 'World/CScriptDamageableTrigger.hpp'), + ('CScriptDockAreaChange', 'World/CScriptDockAreaChange.hpp'), + ('CScriptSpecialFunction', 'World/CScriptSpecialFunction.hpp'), + ('CScriptDebris', 'World/CScriptDebris.hpp'), + + Namespace('MP1'), + ('CBeetle', 'MP1/CBeetle.hpp', 'MP1'), + ('CWarWasp', 'MP1/CWarWasp.hpp', 'MP1'), + ('CSpacePirate', 'MP1/CSpacePirate.hpp', 'MP1'), + ('CNewIntroBoss', 'MP1/CNewIntroBoss.hpp', 'MP1'), + EndNamespace(), +) + +def getqualified(tp): + if len(tp) >= 3: + return tp[2] + '::' + tp[0] + else: + return tp[0] + +headerf = open('TCastTo.hpp', 'w') +sourcef = open('TCastTo.cpp', 'w') + +headerf.write('''#ifndef __TCASTTO_HPP__ +#define __TCASTTO_HPP__ + +namespace urde +{ +class CEntity; +''') + +for tp in CENTITY_TYPES: + if type(tp) == tuple: + headerf.write('class %s;\n' % tp[0]) + elif isinstance(tp, Namespace): + headerf.write('namespace %s\n{\n' % tp.name) + elif isinstance(tp, EndNamespace): + headerf.write('}\n') + +headerf.write('\nclass IVisitor\n{\npublic:\n') + +for tp in CENTITY_TYPES: + if type(tp) == tuple: + headerf.write(' virtual void Visit(%s* p)=0;\n' % getqualified(tp)) + +headerf.write('''}; + +template +class TCastToPtr : public IVisitor +{ +protected: + T* ptr = nullptr; +public: + TCastToPtr(CEntity* p); + TCastToPtr(CEntity& p); + +''') + +for tp in CENTITY_TYPES: + if type(tp) == tuple: + headerf.write(' void Visit(%s* p);\n' % getqualified(tp)) + +headerf.write(''' + T* GetPtr() const { return ptr; } + operator T*() const { return GetPtr(); } + T* operator->() const { return GetPtr(); } + operator bool() const { return ptr != nullptr; } +}; + +template +class TCastToConstPtr : TCastToPtr +{ +public: + TCastToConstPtr(const CEntity* p) : TCastToPtr(const_cast(p)) {} + TCastToConstPtr(const CEntity& p) : TCastToPtr(const_cast(p)) {} + const T* GetPtr() const { return TCastToPtr::ptr; } + operator const T*() const { return GetPtr(); } + const T* operator->() const { return GetPtr(); } + operator bool() const { return TCastToPtr::ptr != nullptr; } +}; + +} + +#endif // __TCASTTO_HPP__ +''') + +headerf.close() + +sourcef.write('#include "TCastTo.hpp"\n\n') + +for tp in CENTITY_TYPES: + if type(tp) == tuple: + sourcef.write('#include "%s"\n' % tp[1]) + +sourcef.write(''' +namespace urde +{ + +template +TCastToPtr::TCastToPtr(CEntity* p) { p->Accept(*this); } + +template +TCastToPtr::TCastToPtr(CEntity& p) { p.Accept(*this); } + +''') + +for tp in CENTITY_TYPES: + if type(tp) == tuple: + qual = getqualified(tp) + sourcef.write('''template +void TCastToPtr::Visit(%s* p) +{ + ptr = reinterpret_cast(std::is_convertible<%s*, T*>::value ? p : nullptr); +} + +''' % (qual, qual)) + +for tp in CENTITY_TYPES: + if type(tp) == tuple: + sourcef.write('template class TCastToPtr<%s>;\n' % getqualified(tp)) + +sourcef.write('\n}\n') + +sourcef.close() diff --git a/Runtime/Weapon/CPlasmaProjectile.cpp b/Runtime/Weapon/CPlasmaProjectile.cpp index f42daad93..264f56cc1 100644 --- a/Runtime/Weapon/CPlasmaProjectile.cpp +++ b/Runtime/Weapon/CPlasmaProjectile.cpp @@ -1,4 +1,5 @@ #include "CPlasmaProjectile.hpp" +#include "TCastTo.hpp" namespace urde { @@ -10,4 +11,10 @@ CPlasmaProjectile::CPlasmaProjectile(const TToken& wDesc, co : CBeamProjectile(wDesc, name, wType, xf, bInfo.x18_, bInfo.x1c_, bInfo.x38_, matType, dInfo, owner, aid, uid, w2, b1) { } + +void CPlasmaProjectile::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/Weapon/CPlasmaProjectile.hpp b/Runtime/Weapon/CPlasmaProjectile.hpp index d32680636..c2cda0a6c 100644 --- a/Runtime/Weapon/CPlasmaProjectile.hpp +++ b/Runtime/Weapon/CPlasmaProjectile.hpp @@ -13,6 +13,8 @@ public: CPlasmaProjectile(const TToken&, const std::string&, EWeaponType, const CBeamInfo&, const zeus::CTransform&, EMaterialTypes, const CDamageInfo&, TUniqueId, TAreaId, TUniqueId, u32, bool, u32); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CActor.cpp b/Runtime/World/CActor.cpp index d5ff607e3..b85d935ba 100644 --- a/Runtime/World/CActor.cpp +++ b/Runtime/World/CActor.cpp @@ -3,6 +3,7 @@ #include "CStateManager.hpp" #include "Collision/CMaterialList.hpp" #include "Audio/CSfxManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -70,7 +71,7 @@ void CActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMana if (conn.x0_state != EScriptObjectState::DFST) continue; - const CActor* act = dynamic_cast(mgr.GetObjectById(mgr.GetIdForScript(conn.x8_objId))); + const CActor* act = TCastToConstPtr(mgr.GetObjectById(mgr.GetIdForScript(conn.x8_objId))); if (act && xc6_ == kInvalidUniqueId) xc6_ = act->GetUniqueId(); } diff --git a/Runtime/World/CEntity.hpp b/Runtime/World/CEntity.hpp index 2e74b8da3..8971d207d 100644 --- a/Runtime/World/CEntity.hpp +++ b/Runtime/World/CEntity.hpp @@ -7,6 +7,7 @@ namespace urde { class CStateManager; +class IVisitor; struct SConnection { @@ -53,8 +54,9 @@ protected: public: static const std::vector NullConnectionList; - virtual ~CEntity() {} + virtual ~CEntity() = default; CEntity(TUniqueId uid, const CEntityInfo& info, bool active, const std::string& name); + virtual void Accept(IVisitor& visitor)=0; virtual void PreThink(float, CStateManager&) {} virtual void Think(float, CStateManager&) {} virtual void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr); diff --git a/Runtime/World/CMakeLists.txt b/Runtime/World/CMakeLists.txt index 2c09bccc2..13a77903d 100644 --- a/Runtime/World/CMakeLists.txt +++ b/Runtime/World/CMakeLists.txt @@ -72,6 +72,7 @@ set(WORLD_SOURCES CScriptBeam.hpp CScriptBeam.cpp CScriptMazeNode.hpp CScriptMazeNode.cpp CScriptShadowProjector.hpp CScriptShadowProjector.cpp + CScriptStreamedMusic.hpp CScriptStreamedMusic.cpp CGrappleParameters.hpp CActorParameters.hpp CLightParameters.hpp diff --git a/Runtime/World/CPlayer.cpp b/Runtime/World/CPlayer.cpp index 12446fe17..666882aef 100644 --- a/Runtime/World/CPlayer.cpp +++ b/Runtime/World/CPlayer.cpp @@ -6,6 +6,7 @@ #include "CSimplePool.hpp" #include "GameGlobalObjects.hpp" #include "Particle/CGenDescription.hpp" +#include "TCastTo.hpp" namespace urde { @@ -69,7 +70,10 @@ bool CPlayer::WasDamaged() const { return false; } void CPlayer::TakeDamage(bool, const zeus::CVector3f&, float, EWeaponType, CStateManager& mgr) {} -void CPlayer::Accept(IVisitor& visitor) {} +void CPlayer::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} CHealthInfo* CPlayer::HealthInfo(CStateManager& mgr) { return nullptr; } diff --git a/Runtime/World/CRepulsor.cpp b/Runtime/World/CRepulsor.cpp index 5e0b6c391..98ca85c89 100644 --- a/Runtime/World/CRepulsor.cpp +++ b/Runtime/World/CRepulsor.cpp @@ -1,5 +1,6 @@ #include "CRepulsor.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -11,6 +12,11 @@ CRepulsor::CRepulsor(TUniqueId uid, bool active, const std::string& name, const { } +void CRepulsor::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CRepulsor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { CActor::AcceptScriptMsg(msg, objId, stateMgr); diff --git a/Runtime/World/CRepulsor.hpp b/Runtime/World/CRepulsor.hpp index c18b1de70..f1902a0d2 100644 --- a/Runtime/World/CRepulsor.hpp +++ b/Runtime/World/CRepulsor.hpp @@ -11,6 +11,7 @@ class CRepulsor : public CActor public: CRepulsor(TUniqueId, bool, const std::string&, const CEntityInfo&, const zeus::CVector3f&, float); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&); float GetAffectRadius() const { return xe8_affectRadius; } diff --git a/Runtime/World/CScriptActor.cpp b/Runtime/World/CScriptActor.cpp index c0fbb150e..00603a6a2 100644 --- a/Runtime/World/CScriptActor.cpp +++ b/Runtime/World/CScriptActor.cpp @@ -1,4 +1,5 @@ #include "CScriptActor.hpp" +#include "TCastTo.hpp" namespace urde { @@ -10,4 +11,10 @@ CScriptActor::CScriptActor(TUniqueId uid, const std::string& name, const CEntity : CPhysicsActor(uid, active, name, info, xf, std::move(mData), matList, aabb, SMoverData(a), actParms, 0.3f, 0.1f) { } + +void CScriptActor::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptActor.hpp b/Runtime/World/CScriptActor.hpp index bf89837af..df8cc421b 100644 --- a/Runtime/World/CScriptActor.hpp +++ b/Runtime/World/CScriptActor.hpp @@ -12,6 +12,7 @@ public: CScriptActor(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, CModelData&&, const zeus::CAABox& aabb, float, float, const CMaterialList& matList, const CHealthInfo&, const CDamageVulnerability&, const CActorParameters&, bool, bool, u32, float, bool, bool, bool, bool); + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptActorKeyframe.cpp b/Runtime/World/CScriptActorKeyframe.cpp index 894d0fde1..7d9e21acc 100644 --- a/Runtime/World/CScriptActorKeyframe.cpp +++ b/Runtime/World/CScriptActorKeyframe.cpp @@ -1,4 +1,5 @@ #include "CScriptActorKeyframe.hpp" +#include "TCastTo.hpp" namespace urde { @@ -15,6 +16,11 @@ CScriptActorKeyframe::CScriptActorKeyframe(TUniqueId uid, const std::string& nam { } +void CScriptActorKeyframe::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptActorKeyframe::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) {} void CScriptActorKeyframe::Think(float dt, CStateManager& mgr) diff --git a/Runtime/World/CScriptActorKeyframe.hpp b/Runtime/World/CScriptActorKeyframe.hpp index 8276b09f3..90987c258 100644 --- a/Runtime/World/CScriptActorKeyframe.hpp +++ b/Runtime/World/CScriptActorKeyframe.hpp @@ -29,6 +29,7 @@ public: CScriptActorKeyframe(TUniqueId uid, const std::string& name, const CEntityInfo& info, s32 w1, bool b1, float f1, bool b2, u32 w2, bool active, float f2); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr); void Think(float, CStateManager&); void UpdateEntity(TUniqueId, CStateManager&); diff --git a/Runtime/World/CScriptActorRotate.cpp b/Runtime/World/CScriptActorRotate.cpp index 5265ad009..38fb12f89 100644 --- a/Runtime/World/CScriptActorRotate.cpp +++ b/Runtime/World/CScriptActorRotate.cpp @@ -1,4 +1,5 @@ #include "CScriptActorRotate.hpp" +#include "TCastTo.hpp" namespace urde { @@ -7,4 +8,10 @@ CScriptActorRotate::CScriptActorRotate(TUniqueId uid, const std::string& name, c : CEntity(uid, info, active, name) { } + +void CScriptActorRotate::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptActorRotate.hpp b/Runtime/World/CScriptActorRotate.hpp index 573a76de7..79472f9f5 100644 --- a/Runtime/World/CScriptActorRotate.hpp +++ b/Runtime/World/CScriptActorRotate.hpp @@ -27,6 +27,8 @@ class CScriptActorRotate : public CEntity public: CScriptActorRotate(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CVector3f&, float, bool, bool, bool); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptAiJumpPoint.cpp b/Runtime/World/CScriptAiJumpPoint.cpp index d8fe118d3..47a6412f1 100644 --- a/Runtime/World/CScriptAiJumpPoint.cpp +++ b/Runtime/World/CScriptAiJumpPoint.cpp @@ -2,6 +2,7 @@ #include "CActorParameters.hpp" #include "CStateManager.hpp" #include "CScriptWaypoint.hpp" +#include "TCastTo.hpp" namespace urde { @@ -14,6 +15,11 @@ CScriptAiJumpPoint::CScriptAiJumpPoint(TUniqueId uid, const std::string& name, c xec_.emplace(xf.origin, xf.origin); } +void CScriptAiJumpPoint::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptAiJumpPoint::Think(float dt, CStateManager&) { if (x110_timeRemaining <= 0) diff --git a/Runtime/World/CScriptAiJumpPoint.hpp b/Runtime/World/CScriptAiJumpPoint.hpp index ea3428c09..47d113896 100644 --- a/Runtime/World/CScriptAiJumpPoint.hpp +++ b/Runtime/World/CScriptAiJumpPoint.hpp @@ -25,6 +25,7 @@ private: public: CScriptAiJumpPoint(TUniqueId, const std::string&, const CEntityInfo&, zeus::CTransform&, bool, float); + void Accept(IVisitor& visitor); void Think(float, CStateManager&); void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&); void AddToRenderer(const zeus::CFrustum&, const CStateManager&) const {} diff --git a/Runtime/World/CScriptAreaAttributes.cpp b/Runtime/World/CScriptAreaAttributes.cpp index f91aa00f9..e5987f2cc 100644 --- a/Runtime/World/CScriptAreaAttributes.cpp +++ b/Runtime/World/CScriptAreaAttributes.cpp @@ -2,6 +2,7 @@ #include "CEnvFxManager.hpp" #include "CStateManager.hpp" #include "CWorld.hpp" +#include "TCastTo.hpp" namespace urde { @@ -21,6 +22,11 @@ CScriptAreaAttributes::CScriptAreaAttributes(TUniqueId uid, const CEntityInfo& i { } +void CScriptAreaAttributes::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptAreaAttributes::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { AcceptScriptMsg(msg, objId, stateMgr); diff --git a/Runtime/World/CScriptAreaAttributes.hpp b/Runtime/World/CScriptAreaAttributes.hpp index dfc40e873..98a03d45b 100644 --- a/Runtime/World/CScriptAreaAttributes.hpp +++ b/Runtime/World/CScriptAreaAttributes.hpp @@ -22,6 +22,7 @@ public: float envFxDensity, float thermalHeat, float xrayFogDistance, float worldLightingLevel, ResId skybox, EPhazonType phazonType); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr); bool GetNeedsSky() const; diff --git a/Runtime/World/CScriptBeam.cpp b/Runtime/World/CScriptBeam.cpp index 1d398ab1f..9ce4e5891 100644 --- a/Runtime/World/CScriptBeam.cpp +++ b/Runtime/World/CScriptBeam.cpp @@ -3,6 +3,7 @@ #include "Particle/CWeaponDescription.hpp" #include "Weapon/CPlasmaProjectile.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -18,6 +19,11 @@ CScriptBeam::CScriptBeam(TUniqueId uid, const std::string& name, const CEntityIn { } +void CScriptBeam::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptBeam::Think(float dt, CStateManager& mgr) { #if 0 diff --git a/Runtime/World/CScriptBeam.hpp b/Runtime/World/CScriptBeam.hpp index 7a3e05e66..0d9c27441 100644 --- a/Runtime/World/CScriptBeam.hpp +++ b/Runtime/World/CScriptBeam.hpp @@ -18,6 +18,7 @@ public: CScriptBeam(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, bool, const TToken&, const CBeamInfo&, const CDamageInfo&); + void Accept(IVisitor& visitor); void Think(float, CStateManager &); void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager &); }; diff --git a/Runtime/World/CScriptCameraBlurKeyframe.cpp b/Runtime/World/CScriptCameraBlurKeyframe.cpp index a7a77b843..22b2f8546 100644 --- a/Runtime/World/CScriptCameraBlurKeyframe.cpp +++ b/Runtime/World/CScriptCameraBlurKeyframe.cpp @@ -1,4 +1,5 @@ #include "CScriptCameraBlurKeyframe.hpp" +#include "TCastTo.hpp" namespace urde { @@ -7,4 +8,10 @@ CScriptCameraBlurKeyframe::CScriptCameraBlurKeyframe(TUniqueId uid, const std::s : CEntity(uid, info, active, name) { } + +void CScriptCameraBlurKeyframe::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptCameraBlurKeyframe.hpp b/Runtime/World/CScriptCameraBlurKeyframe.hpp index 156412d00..121619304 100644 --- a/Runtime/World/CScriptCameraBlurKeyframe.hpp +++ b/Runtime/World/CScriptCameraBlurKeyframe.hpp @@ -9,6 +9,8 @@ class CScriptCameraBlurKeyframe : public CEntity { public: CScriptCameraBlurKeyframe(TUniqueId, const std::string&, const CEntityInfo&, u32, float, u32, float, float, bool); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptCameraFilterKeyframe.cpp b/Runtime/World/CScriptCameraFilterKeyframe.cpp index 2edce8a11..c9afbff54 100644 --- a/Runtime/World/CScriptCameraFilterKeyframe.cpp +++ b/Runtime/World/CScriptCameraFilterKeyframe.cpp @@ -1,4 +1,5 @@ #include "CScriptCameraFilterKeyframe.hpp" +#include "TCastTo.hpp" namespace urde { @@ -8,4 +9,10 @@ CScriptCameraFilterKeyframe::CScriptCameraFilterKeyframe(TUniqueId uid, const st : CEntity(uid, info, active, name) { } + +void CScriptCameraFilterKeyframe::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptCameraFilterKeyframe.hpp b/Runtime/World/CScriptCameraFilterKeyframe.hpp index c07ac31e2..30b030f6e 100644 --- a/Runtime/World/CScriptCameraFilterKeyframe.hpp +++ b/Runtime/World/CScriptCameraFilterKeyframe.hpp @@ -20,6 +20,8 @@ class CScriptCameraFilterKeyframe : public CEntity public: CScriptCameraFilterKeyframe(TUniqueId, const std::string&, const CEntityInfo&, u32, u32, u32, u32, const zeus::CColor&, float, float, u32, bool); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptCameraHint.cpp b/Runtime/World/CScriptCameraHint.cpp index 476d504a8..fdcaa783a 100644 --- a/Runtime/World/CScriptCameraHint.cpp +++ b/Runtime/World/CScriptCameraHint.cpp @@ -1,6 +1,7 @@ #include "CScriptCameraHint.hpp" #include "Character/CModelData.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -13,4 +14,10 @@ CScriptCameraHint::CScriptCameraHint(TUniqueId uid, const std::string& name, con CActorParameters::None(), kInvalidUniqueId) { } + +void CScriptCameraHint::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptCameraHint.hpp b/Runtime/World/CScriptCameraHint.hpp index 463c38379..ad1930929 100644 --- a/Runtime/World/CScriptCameraHint.hpp +++ b/Runtime/World/CScriptCameraHint.hpp @@ -12,6 +12,8 @@ public: CScriptCameraHint(TUniqueId, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf, bool, u32, u32, u32, float, float, float, const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&, float, float, float, float, float, float, float, float, float, float); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptCameraHintTrigger.cpp b/Runtime/World/CScriptCameraHintTrigger.cpp index 07a35bbaf..5e94aa306 100644 --- a/Runtime/World/CScriptCameraHintTrigger.cpp +++ b/Runtime/World/CScriptCameraHintTrigger.cpp @@ -1,5 +1,6 @@ #include "CScriptCameraHintTrigger.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -15,4 +16,10 @@ CScriptCameraHintTrigger::CScriptCameraHintTrigger(TUniqueId uid, bool active, c , x130_25_(b3) { } + +void CScriptCameraHintTrigger::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptCameraHintTrigger.hpp b/Runtime/World/CScriptCameraHintTrigger.hpp index 6f816f895..5caaed88b 100644 --- a/Runtime/World/CScriptCameraHintTrigger.hpp +++ b/Runtime/World/CScriptCameraHintTrigger.hpp @@ -24,6 +24,8 @@ class CScriptCameraHintTrigger : public CActor public: CScriptCameraHintTrigger(TUniqueId, bool, const std::string& name, const CEntityInfo&, const zeus::CVector3f&, const zeus::CTransform&, bool, bool); + + void Accept(IVisitor& visitor); }; } #endif // __URDE_CSCRIPTCAMERAHINTTRIGGER_HPP__ diff --git a/Runtime/World/CScriptCameraPitchVolume.cpp b/Runtime/World/CScriptCameraPitchVolume.cpp index 8a7d20dea..722d8e659 100644 --- a/Runtime/World/CScriptCameraPitchVolume.cpp +++ b/Runtime/World/CScriptCameraPitchVolume.cpp @@ -4,6 +4,7 @@ #include "CPlayer.hpp" #include "Camera/CCameraManager.hpp" #include "Camera/CFirstPersonCamera.hpp" +#include "TCastTo.hpp" namespace urde { @@ -23,6 +24,11 @@ CScriptCameraPitchVolume::CScriptCameraPitchVolume(TUniqueId uid, bool active, c { } +void CScriptCameraPitchVolume::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptCameraPitchVolume::Think(float, CStateManager&) { if (!x30_24_active) @@ -36,7 +42,7 @@ rstl::optional_object CScriptCameraPitchVolume::GetTouchBounds() c void CScriptCameraPitchVolume::Touch(CActor& act, CStateManager& mgr) { - CPlayer* pl = dynamic_cast(&act); + CPlayer* pl = TCastToPtr(&act); if (!pl) return; diff --git a/Runtime/World/CScriptCameraPitchVolume.hpp b/Runtime/World/CScriptCameraPitchVolume.hpp index 034ad2a49..00ffa295f 100644 --- a/Runtime/World/CScriptCameraPitchVolume.hpp +++ b/Runtime/World/CScriptCameraPitchVolume.hpp @@ -29,6 +29,7 @@ public: CScriptCameraPitchVolume(TUniqueId, bool, const std::string&, const CEntityInfo&, const zeus::CVector3f&, const zeus::CTransform&, const zeus::CRelAngle&, const zeus::CRelAngle&, float); + void Accept(IVisitor& visitor); void Think(float, CStateManager&); rstl::optional_object GetTouchBounds() const; void Touch(CActor&, CStateManager&); diff --git a/Runtime/World/CScriptCameraWaypoint.cpp b/Runtime/World/CScriptCameraWaypoint.cpp index 4cdff4772..d40881e46 100644 --- a/Runtime/World/CScriptCameraWaypoint.cpp +++ b/Runtime/World/CScriptCameraWaypoint.cpp @@ -1,5 +1,6 @@ #include "CScriptCameraWaypoint.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -12,4 +13,9 @@ CScriptCameraWaypoint::CScriptCameraWaypoint(TUniqueId uid, const std::string& n } +void CScriptCameraWaypoint::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptCameraWaypoint.hpp b/Runtime/World/CScriptCameraWaypoint.hpp index e2800d4e4..e1052fc3c 100644 --- a/Runtime/World/CScriptCameraWaypoint.hpp +++ b/Runtime/World/CScriptCameraWaypoint.hpp @@ -11,6 +11,8 @@ class CScriptCameraWaypoint : public CActor public: CScriptCameraWaypoint(TUniqueId uid, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf, bool active, float, u32); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptColorModulate.cpp b/Runtime/World/CScriptColorModulate.cpp index 769c11c32..5552e7cac 100644 --- a/Runtime/World/CScriptColorModulate.cpp +++ b/Runtime/World/CScriptColorModulate.cpp @@ -1,6 +1,8 @@ #include "CScriptColorModulate.hpp" #include "Graphics/CModel.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" + namespace urde { CScriptColorModulate::CScriptColorModulate(TUniqueId uid, const std::string& name, const CEntityInfo& info, @@ -22,6 +24,11 @@ CScriptColorModulate::CScriptColorModulate(TUniqueId uid, const std::string& nam } +void CScriptColorModulate::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptColorModulate::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr) { CEntity::AcceptScriptMsg(msg, objId, stateMgr); diff --git a/Runtime/World/CScriptColorModulate.hpp b/Runtime/World/CScriptColorModulate.hpp index 1785de4eb..2a311cdf6 100644 --- a/Runtime/World/CScriptColorModulate.hpp +++ b/Runtime/World/CScriptColorModulate.hpp @@ -44,6 +44,7 @@ public: CScriptColorModulate(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CColor&, const zeus::CColor&, EBlendMode, float, float, bool, bool, bool, bool, bool, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); void Think(float, CStateManager &); zeus::CColor CalculateFlags(const zeus::CColor&) const; diff --git a/Runtime/World/CScriptCounter.cpp b/Runtime/World/CScriptCounter.cpp index d56e58326..7d1da1a3f 100644 --- a/Runtime/World/CScriptCounter.cpp +++ b/Runtime/World/CScriptCounter.cpp @@ -1,4 +1,5 @@ #include "CScriptCounter.hpp" +#include "TCastTo.hpp" namespace urde { @@ -9,4 +10,9 @@ CScriptCounter::CScriptCounter(TUniqueId uid, const std::string& name, const CEn { } +void CScriptCounter::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptCounter.hpp b/Runtime/World/CScriptCounter.hpp index 253fb2938..7cc622f67 100644 --- a/Runtime/World/CScriptCounter.hpp +++ b/Runtime/World/CScriptCounter.hpp @@ -11,6 +11,8 @@ class CScriptCounter : public CEntity public: CScriptCounter(TUniqueId, const std::string& name, const CEntityInfo& info, u32, u32, bool, bool); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptCoverPoint.cpp b/Runtime/World/CScriptCoverPoint.cpp index f7debd5f9..be8e8158f 100644 --- a/Runtime/World/CScriptCoverPoint.cpp +++ b/Runtime/World/CScriptCoverPoint.cpp @@ -1,6 +1,7 @@ #include "CScriptCoverPoint.hpp" #include "CActorParameters.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -17,6 +18,11 @@ CScriptCoverPoint::CScriptCoverPoint(TUniqueId uid, const std::string &name, con x100_touchBounds.emplace(xf.origin, xf.origin); } +void CScriptCoverPoint::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptCoverPoint::Think(float delta, CStateManager&) { if (x11c_timeLeft <= 0.f) diff --git a/Runtime/World/CScriptCoverPoint.hpp b/Runtime/World/CScriptCoverPoint.hpp index 75d849998..26699fac3 100644 --- a/Runtime/World/CScriptCoverPoint.hpp +++ b/Runtime/World/CScriptCoverPoint.hpp @@ -38,6 +38,7 @@ public: CScriptCoverPoint(TUniqueId uid, const std::string& name, const CEntityInfo& info, zeus::CTransform xf, bool active, u32 flags, bool crouch, float horizontalAngle, float verticalAngle, float coverTime); + void Accept(IVisitor& visitor); void Think(float, CStateManager &); void AddToRenderer(const zeus::CFrustum &, CStateManager &) {} void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager &); diff --git a/Runtime/World/CScriptDamageableTrigger.cpp b/Runtime/World/CScriptDamageableTrigger.cpp index 80aef9760..d564deb89 100644 --- a/Runtime/World/CScriptDamageableTrigger.cpp +++ b/Runtime/World/CScriptDamageableTrigger.cpp @@ -1,5 +1,6 @@ #include "CScriptDamageableTrigger.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -31,4 +32,9 @@ CScriptDamageableTrigger::CScriptDamageableTrigger(TUniqueId uid, const std::str { } +void CScriptDamageableTrigger::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptDamageableTrigger.hpp b/Runtime/World/CScriptDamageableTrigger.hpp index fa8955223..25297e6ff 100644 --- a/Runtime/World/CScriptDamageableTrigger.hpp +++ b/Runtime/World/CScriptDamageableTrigger.hpp @@ -20,6 +20,8 @@ public: CScriptDamageableTrigger(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CVector3f&, const zeus::CVector3f&, const CHealthInfo&, const CDamageVulnerability&, u32, ResId, ResId, ResId, ECanOrbit, bool, const CVisorParameters&); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptDebris.cpp b/Runtime/World/CScriptDebris.cpp index 69569909e..98dbae738 100644 --- a/Runtime/World/CScriptDebris.cpp +++ b/Runtime/World/CScriptDebris.cpp @@ -1,4 +1,5 @@ #include "CScriptDebris.hpp" +#include "TCastTo.hpp" namespace urde { @@ -14,6 +15,11 @@ CScriptDebris::CScriptDebris(TUniqueId uid, const std::string& name, const CEnti } +void CScriptDebris::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + #if 0 CScriptDebris::CScriptDebris(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, CModelData&&, const CActorParameters&, float, float, float, float, float, float, float, float, float, diff --git a/Runtime/World/CScriptDebris.hpp b/Runtime/World/CScriptDebris.hpp index 6479a1c9d..c1076c7c8 100644 --- a/Runtime/World/CScriptDebris.hpp +++ b/Runtime/World/CScriptDebris.hpp @@ -22,6 +22,8 @@ public: CScriptDebris(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, CModelData&&, const CActorParameters&, ResId, const zeus::CVector3f&, float, const zeus::CVector3f&, const zeus::CColor&, float, float, float, EScaleType, bool, bool, bool); + + void Accept(IVisitor& visitor); #if 0 CScriptDebris(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, CModelData&&, const CActorParameters&, float, float, float, float, float, float, float, float, float, diff --git a/Runtime/World/CScriptDistanceFog.cpp b/Runtime/World/CScriptDistanceFog.cpp index dfce6c822..eec60c85d 100644 --- a/Runtime/World/CScriptDistanceFog.cpp +++ b/Runtime/World/CScriptDistanceFog.cpp @@ -1,6 +1,7 @@ #include "CScriptDistanceFog.hpp" #include "CStateManager.hpp" #include "CWorld.hpp" +#include "TCastTo.hpp" namespace urde { @@ -28,6 +29,11 @@ CScriptDistanceFog::CScriptDistanceFog(TUniqueId uid, const std::string& name, c x61_nonZero = true; } +void CScriptDistanceFog::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptDistanceFog::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { CEntity::AcceptScriptMsg(msg, objId, stateMgr); diff --git a/Runtime/World/CScriptDistanceFog.hpp b/Runtime/World/CScriptDistanceFog.hpp index 3c68afd2f..ad48a3ee6 100644 --- a/Runtime/World/CScriptDistanceFog.hpp +++ b/Runtime/World/CScriptDistanceFog.hpp @@ -24,6 +24,7 @@ public: const zeus::CColor&, const zeus::CVector2f&, float, const zeus::CVector2f&, bool, bool, float, float, float, float); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); }; } diff --git a/Runtime/World/CScriptDock.cpp b/Runtime/World/CScriptDock.cpp index 206681b93..2fe4674c4 100644 --- a/Runtime/World/CScriptDock.cpp +++ b/Runtime/World/CScriptDock.cpp @@ -6,6 +6,7 @@ #include "CStateManager.hpp" #include "CScriptDoor.hpp" #include "CPlayer.hpp" +#include "TCastTo.hpp" namespace urde { @@ -31,6 +32,11 @@ CScriptDock::CScriptDock(TUniqueId uid, const std::string& name, const CEntityIn { } +void CScriptDock::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptDock::Think(float dt, CStateManager& mgr) { if (!GetActive()) diff --git a/Runtime/World/CScriptDock.hpp b/Runtime/World/CScriptDock.hpp index 1d417d057..ec19108e4 100644 --- a/Runtime/World/CScriptDock.hpp +++ b/Runtime/World/CScriptDock.hpp @@ -35,6 +35,7 @@ public: 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); + void Accept(IVisitor& visitor); void Think(float, CStateManager&); void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&); rstl::optional_object GetTouchBounds() const; diff --git a/Runtime/World/CScriptDockAreaChange.cpp b/Runtime/World/CScriptDockAreaChange.cpp index 6f859166f..c49b4d27f 100644 --- a/Runtime/World/CScriptDockAreaChange.cpp +++ b/Runtime/World/CScriptDockAreaChange.cpp @@ -1,6 +1,7 @@ #include "CScriptDockAreaChange.hpp" #include "CStateManager.hpp" #include "World/CScriptDock.hpp" +#include "TCastTo.hpp" namespace urde { @@ -10,6 +11,11 @@ CScriptDockAreaChange::CScriptDockAreaChange(TUniqueId uid, const std::string& n { } +void CScriptDockAreaChange::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptDockAreaChange::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { if (msg == EScriptObjectMessage::Action && GetActive()) @@ -23,7 +29,7 @@ void CScriptDockAreaChange::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId for (auto it = search.first ; it != search.second ; ++it) { TUniqueId id = it->second; - CScriptDock* dock = dynamic_cast(stateMgr.ObjectById(id)); + CScriptDock* dock = TCastToPtr(stateMgr.ObjectById(id)); if (dock) dock->SetDockReference(stateMgr, x34_dockReference); } diff --git a/Runtime/World/CScriptDockAreaChange.hpp b/Runtime/World/CScriptDockAreaChange.hpp index 86dd2d02c..fa251949a 100644 --- a/Runtime/World/CScriptDockAreaChange.hpp +++ b/Runtime/World/CScriptDockAreaChange.hpp @@ -11,6 +11,7 @@ class CScriptDockAreaChange : public CEntity public: CScriptDockAreaChange(TUniqueId, const std::string&, const CEntityInfo&, s32, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); }; } diff --git a/Runtime/World/CScriptDoor.cpp b/Runtime/World/CScriptDoor.cpp index 237de8e28..8f4765c20 100644 --- a/Runtime/World/CScriptDoor.cpp +++ b/Runtime/World/CScriptDoor.cpp @@ -8,6 +8,7 @@ #include "CWorld.hpp" #include "Camera/CCameraManager.hpp" #include "Camera/CBallCamera.hpp" +#include "TCastTo.hpp" namespace urde { @@ -45,6 +46,11 @@ CScriptDoor::CScriptDoor(TUniqueId uid, const std::string& name, const CEntityIn SetMass(0.f); } +void CScriptDoor::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + /* ORIGINAL 0-00 OFFSET: 8007F054 */ zeus::CVector3f CScriptDoor::GetOrbitPosition(const CStateManager& /*mgr*/) const { @@ -108,7 +114,7 @@ void CScriptDoor::ForceClosed(CStateManager & mgr) /* ORIGINAL 0-00 OFFSET: 8007E1C4 */ bool CScriptDoor::IsConnectedToArea(const CStateManager& mgr, TAreaId area) { - const CScriptDock* dock = dynamic_cast(mgr.GetObjectById(x282_dockId)); + const CScriptDock* dock = TCastToConstPtr(mgr.GetObjectById(x282_dockId)); if (dock) { if (dock->GetDestinationAreaId() == area) @@ -127,7 +133,7 @@ void CScriptDoor::OpenDoor(TUniqueId uid, CStateManager& mgr) TEditorId eid = mgr.GetEditorIdForUniqueId(uid); mgr.MapWorldInfo()->SetDoorVisited(eid, true); - const CScriptDoor* door = dynamic_cast(mgr.GetObjectById(uid)); + const CScriptDoor* door = TCastToConstPtr(mgr.GetObjectById(uid)); if (door) x27c_partner = door->GetUniqueId(); @@ -146,7 +152,7 @@ void CScriptDoor::OpenDoor(TUniqueId uid, CStateManager& mgr) /* ORIGINAL 0-00 OFFSET: 8007ED4C */ u32 CScriptDoor::GetDoorOpenCondition(CStateManager& mgr) { - const CScriptDock* dock = dynamic_cast(mgr.GetObjectById(x282_dockId)); + const CScriptDock* dock = TCastToConstPtr(mgr.GetObjectById(x282_dockId)); if (!dock) return 2; diff --git a/Runtime/World/CScriptDoor.hpp b/Runtime/World/CScriptDoor.hpp index d576f6f82..213a8209d 100644 --- a/Runtime/World/CScriptDoor.hpp +++ b/Runtime/World/CScriptDoor.hpp @@ -57,6 +57,7 @@ public: bool active, bool open, bool, float, bool ballDoor); zeus::CVector3f GetOrbitPosition(const CStateManager& mgr) const; + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr); void Think(float, CStateManager& mgr); void AddToRenderer(const zeus::CFrustum&, CStateManager& mgr); diff --git a/Runtime/World/CScriptEffect.cpp b/Runtime/World/CScriptEffect.cpp index fbac1642e..20f482286 100644 --- a/Runtime/World/CScriptEffect.cpp +++ b/Runtime/World/CScriptEffect.cpp @@ -2,6 +2,7 @@ #include "Character/CModelData.hpp" #include "Collision/CMaterialList.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -16,4 +17,9 @@ CScriptEffect::CScriptEffect(TUniqueId uid, const std::string& name, const CEnti { } +void CScriptEffect::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptEffect.hpp b/Runtime/World/CScriptEffect.hpp index 7feb70e8e..142aa287a 100644 --- a/Runtime/World/CScriptEffect.hpp +++ b/Runtime/World/CScriptEffect.hpp @@ -14,6 +14,8 @@ public: ResId partId, ResId elscId, bool, bool, bool, bool active, bool, float, float, float, float, bool, float, float, float, bool, bool, bool, const CLightParameters& lParms, bool); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptGenerator.cpp b/Runtime/World/CScriptGenerator.cpp index 2827adc9e..1fda3537a 100644 --- a/Runtime/World/CScriptGenerator.cpp +++ b/Runtime/World/CScriptGenerator.cpp @@ -1,5 +1,6 @@ #include "CScriptGenerator.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -16,6 +17,11 @@ CScriptGenerator::CScriptGenerator(TUniqueId uid, const std::string& name, const { } +void CScriptGenerator::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { if (msg == EScriptObjectMessage::SetToZero && GetActive()) diff --git a/Runtime/World/CScriptGenerator.hpp b/Runtime/World/CScriptGenerator.hpp index 595d0d114..fd83f809a 100644 --- a/Runtime/World/CScriptGenerator.hpp +++ b/Runtime/World/CScriptGenerator.hpp @@ -26,6 +26,7 @@ public: CScriptGenerator(TUniqueId uid, const std::string& name, const CEntityInfo& info, u32, bool, const zeus::CVector3f&, bool, bool, float, float); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr); }; } diff --git a/Runtime/World/CScriptGrapplePoint.cpp b/Runtime/World/CScriptGrapplePoint.cpp index 80e514aaf..247e78e8b 100644 --- a/Runtime/World/CScriptGrapplePoint.cpp +++ b/Runtime/World/CScriptGrapplePoint.cpp @@ -2,6 +2,7 @@ #include "Character/CModelData.hpp" #include "Collision/CMaterialList.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -16,4 +17,9 @@ CScriptGrapplePoint::CScriptGrapplePoint(TUniqueId uid, const std::string &name, { } +void CScriptGrapplePoint::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptGrapplePoint.hpp b/Runtime/World/CScriptGrapplePoint.hpp index 11e5216eb..67fb63be9 100644 --- a/Runtime/World/CScriptGrapplePoint.hpp +++ b/Runtime/World/CScriptGrapplePoint.hpp @@ -13,6 +13,8 @@ class CScriptGrapplePoint : public CActor public: CScriptGrapplePoint(TUniqueId uid, const std::string& name, const CEntityInfo& info, const zeus::CTransform& transform, bool active, const CGrappleParameters& params); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptHUDMemo.cpp b/Runtime/World/CScriptHUDMemo.cpp index 2b255e588..80bb36678 100644 --- a/Runtime/World/CScriptHUDMemo.cpp +++ b/Runtime/World/CScriptHUDMemo.cpp @@ -1,4 +1,5 @@ #include "CScriptHUDMemo.hpp" +#include "TCastTo.hpp" namespace urde { @@ -9,4 +10,9 @@ CScriptHUDMemo::CScriptHUDMemo(TUniqueId uid, const std::string& name, const CEn { } +void CScriptHUDMemo::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptHUDMemo.hpp b/Runtime/World/CScriptHUDMemo.hpp index e6114c142..b01eaf234 100644 --- a/Runtime/World/CScriptHUDMemo.hpp +++ b/Runtime/World/CScriptHUDMemo.hpp @@ -19,6 +19,8 @@ private: public: CScriptHUDMemo(TUniqueId, const std::string&, const CEntityInfo&, const CHUDMemoParms&, CScriptHUDMemo::EDisplayType, ResId, bool); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptMemoryRelay.cpp b/Runtime/World/CScriptMemoryRelay.cpp index 30123140f..739576a83 100644 --- a/Runtime/World/CScriptMemoryRelay.cpp +++ b/Runtime/World/CScriptMemoryRelay.cpp @@ -1,6 +1,7 @@ #include "CScriptMemoryRelay.hpp" #include "CStateManager.hpp" #include "CRelayTracker.hpp" +#include "TCastTo.hpp" namespace urde { @@ -13,6 +14,11 @@ CScriptMemoryRelay::CScriptMemoryRelay(TUniqueId uid, const std::string& name, c { } +void CScriptMemoryRelay::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptMemoryRelay::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr) { if (x34_26_ignoreMessages) diff --git a/Runtime/World/CScriptMemoryRelay.hpp b/Runtime/World/CScriptMemoryRelay.hpp index 3de65ce6d..c722bc24e 100644 --- a/Runtime/World/CScriptMemoryRelay.hpp +++ b/Runtime/World/CScriptMemoryRelay.hpp @@ -19,6 +19,7 @@ class CScriptMemoryRelay : public CEntity }; public: CScriptMemoryRelay(TUniqueId, const std::string& name, const CEntityInfo&, bool, bool, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); }; } diff --git a/Runtime/World/CScriptPickup.cpp b/Runtime/World/CScriptPickup.cpp index 5beabf65f..82796006f 100644 --- a/Runtime/World/CScriptPickup.cpp +++ b/Runtime/World/CScriptPickup.cpp @@ -1,4 +1,5 @@ #include "CScriptPickup.hpp" +#include "TCastTo.hpp" namespace urde { @@ -9,4 +10,10 @@ CScriptPickup::CScriptPickup(TUniqueId uid, const std::string& name, const CEnti 0.3f, 0.1f) { } + +void CScriptPickup::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptPickup.hpp b/Runtime/World/CScriptPickup.hpp index 88934b0af..0c755d47f 100644 --- a/Runtime/World/CScriptPickup.hpp +++ b/Runtime/World/CScriptPickup.hpp @@ -10,6 +10,8 @@ class CScriptPickup : public CPhysicsActor public: CScriptPickup(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, CModelData&&, const CActorParameters&, const zeus::CAABox&, s32, s32, s32, s32, float, float, float, float, bool); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptPickupGenerator.cpp b/Runtime/World/CScriptPickupGenerator.cpp index ac137bde3..7f3a209d1 100644 --- a/Runtime/World/CScriptPickupGenerator.cpp +++ b/Runtime/World/CScriptPickupGenerator.cpp @@ -1,4 +1,5 @@ #include "CScriptPickupGenerator.hpp" +#include "TCastTo.hpp" namespace urde { @@ -8,6 +9,11 @@ CScriptPickupGenerator::CScriptPickupGenerator(TUniqueId uid, const std::string& { } +void CScriptPickupGenerator::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptPickupGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { if (msg == EScriptObjectMessage::SetToZero && x30_24_active && x44_ != 100.f) diff --git a/Runtime/World/CScriptPickupGenerator.hpp b/Runtime/World/CScriptPickupGenerator.hpp index 736843cbc..21a0686af 100644 --- a/Runtime/World/CScriptPickupGenerator.hpp +++ b/Runtime/World/CScriptPickupGenerator.hpp @@ -15,6 +15,7 @@ class CScriptPickupGenerator : public CEntity public: CScriptPickupGenerator(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CVector3f&, float, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); }; } diff --git a/Runtime/World/CScriptPlatform.cpp b/Runtime/World/CScriptPlatform.cpp index 21ce8a315..bbd87a3e4 100644 --- a/Runtime/World/CScriptPlatform.cpp +++ b/Runtime/World/CScriptPlatform.cpp @@ -1,5 +1,6 @@ #include "CScriptPlatform.hpp" #include "Collision/CMaterialList.hpp" +#include "TCastTo.hpp" namespace urde { @@ -24,4 +25,10 @@ CScriptPlatform::CScriptPlatform(TUniqueId uid, const std::string& name, const C actParms, 0.3f, 0.1f) { } + +void CScriptPlatform::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptPlatform.hpp b/Runtime/World/CScriptPlatform.hpp index c8895f29a..6217655b3 100644 --- a/Runtime/World/CScriptPlatform.hpp +++ b/Runtime/World/CScriptPlatform.hpp @@ -16,6 +16,8 @@ public: CModelData&& mData, const CActorParameters& actParms, const zeus::CAABox& aabb, float, bool, float, bool, const CHealthInfo& hInfo, const CDamageVulnerability& dInfo, const rstl::optional_object>& dcln, bool, u32, u32); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptPointOfInterest.cpp b/Runtime/World/CScriptPointOfInterest.cpp index f524e453a..485807a35 100644 --- a/Runtime/World/CScriptPointOfInterest.cpp +++ b/Runtime/World/CScriptPointOfInterest.cpp @@ -2,6 +2,7 @@ #include "CActorParameters.hpp" #include "CStateManager.hpp" #include "CPlayerState.hpp" +#include "TCastTo.hpp" namespace urde { @@ -15,6 +16,11 @@ CScriptPointOfInterest::CScriptPointOfInterest(TUniqueId uid, const std::string& { } +void CScriptPointOfInterest::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptPointOfInterest::Think(float dt, CStateManager& mgr) { xe7_31_ = mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Scan; diff --git a/Runtime/World/CScriptPointOfInterest.hpp b/Runtime/World/CScriptPointOfInterest.hpp index 415be779a..463a0b6f3 100644 --- a/Runtime/World/CScriptPointOfInterest.hpp +++ b/Runtime/World/CScriptPointOfInterest.hpp @@ -14,6 +14,7 @@ public: CScriptPointOfInterest(TUniqueId, const std::string&, const CEntityInfo, const zeus::CTransform&, bool, const CScannableParameters&, float); + void Accept(IVisitor& visitor); void Think(float, CStateManager &); void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager &); void AddToRenderer(const zeus::CFrustum &, const CStateManager &) const; diff --git a/Runtime/World/CScriptRandomRelay.cpp b/Runtime/World/CScriptRandomRelay.cpp index 6c072b4a4..81ae1e797 100644 --- a/Runtime/World/CScriptRandomRelay.cpp +++ b/Runtime/World/CScriptRandomRelay.cpp @@ -1,5 +1,6 @@ #include "CScriptRandomRelay.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -12,6 +13,11 @@ CScriptRandomRelay::CScriptRandomRelay(TUniqueId uid, const std::string& name, c { } +void CScriptRandomRelay::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptRandomRelay::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { CEntity::AcceptScriptMsg(msg, objId, stateMgr); diff --git a/Runtime/World/CScriptRandomRelay.hpp b/Runtime/World/CScriptRandomRelay.hpp index 868dc93d7..4e0d8e899 100644 --- a/Runtime/World/CScriptRandomRelay.hpp +++ b/Runtime/World/CScriptRandomRelay.hpp @@ -13,6 +13,7 @@ class CScriptRandomRelay : public CEntity public: CScriptRandomRelay(TUniqueId, const std::string&, const CEntityInfo&, s32, s32, bool, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); void SendLocalScriptMsgs(EScriptObjectState state, CStateManager& stateMgr); }; diff --git a/Runtime/World/CScriptRelay.cpp b/Runtime/World/CScriptRelay.cpp index e67b1fb29..d63d459b4 100644 --- a/Runtime/World/CScriptRelay.cpp +++ b/Runtime/World/CScriptRelay.cpp @@ -1,5 +1,6 @@ #include "CScriptRelay.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -9,6 +10,11 @@ CScriptRelay::CScriptRelay(TUniqueId uid, const std::string& name, const CEntity { } +void CScriptRelay::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptRelay::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr) { CEntity::AcceptScriptMsg(msg, objId, stateMgr); @@ -66,7 +72,7 @@ void CScriptRelay::UpdateObjectRef(CStateManager& stateMgr) *tmp = x34_; return; } - const CScriptRelay* obj = dynamic_cast(stateMgr.GetObjectById(*tmp)); + const CScriptRelay* obj = TCastToConstPtr(stateMgr.GetObjectById(*tmp)); if (obj) tmp = (TUniqueId*)&obj->x34_; } diff --git a/Runtime/World/CScriptRelay.hpp b/Runtime/World/CScriptRelay.hpp index 41643c460..9a8c11bc9 100644 --- a/Runtime/World/CScriptRelay.hpp +++ b/Runtime/World/CScriptRelay.hpp @@ -12,6 +12,7 @@ class CScriptRelay : public CEntity public: CScriptRelay(TUniqueId, const std::string&, const CEntityInfo&, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); void Think(float, CStateManager& stateMgr); void UpdateObjectRef(CStateManager& stateMgr); diff --git a/Runtime/World/CScriptShadowProjector.cpp b/Runtime/World/CScriptShadowProjector.cpp index e868db1c7..b6be64bd1 100644 --- a/Runtime/World/CScriptShadowProjector.cpp +++ b/Runtime/World/CScriptShadowProjector.cpp @@ -2,6 +2,7 @@ #include "World/CActorParameters.hpp" #include "World/CProjectedShadow.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -22,6 +23,11 @@ CScriptShadowProjector::CScriptShadowProjector(TUniqueId uid, const std::string& { } +void CScriptShadowProjector::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptShadowProjector::Think(float dt, CStateManager& mgr) { if (GetActive() && x110_25_shadowInvalidated) @@ -65,7 +71,7 @@ void CScriptShadowProjector::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId if (conn.x0_state != EScriptObjectState::Play) continue; - const CActor* act = dynamic_cast(mgr.GetObjectById(mgr.GetIdForScript(conn.x8_objId))); + const CActor* act = TCastToConstPtr(mgr.GetObjectById(mgr.GetIdForScript(conn.x8_objId))); if (!act) continue; const CModelData* mData = act->GetModelData(); diff --git a/Runtime/World/CScriptShadowProjector.hpp b/Runtime/World/CScriptShadowProjector.hpp index a2b06dad5..44fd10cfe 100644 --- a/Runtime/World/CScriptShadowProjector.hpp +++ b/Runtime/World/CScriptShadowProjector.hpp @@ -30,6 +30,7 @@ public: CScriptShadowProjector(TUniqueId, const std::string&, const CEntityInfo&, const zeus::CTransform&, bool, const zeus::CVector3f&, bool, float, float, float, float, s32); + void Accept(IVisitor& visitor); void Think(float, CStateManager &); void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager &); void PreRender(const zeus::CFrustum &, const CStateManager &); diff --git a/Runtime/World/CScriptSound.cpp b/Runtime/World/CScriptSound.cpp index 66c24f767..e5f69a7dd 100644 --- a/Runtime/World/CScriptSound.cpp +++ b/Runtime/World/CScriptSound.cpp @@ -2,6 +2,7 @@ #include "Character/CModelData.hpp" #include "Collision/CMaterialList.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -14,4 +15,9 @@ CScriptSound::CScriptSound(TUniqueId uid, const std::string& name, const CEntity { } +void CScriptSound::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptSound.hpp b/Runtime/World/CScriptSound.hpp index c084b1d17..3c9da12cb 100644 --- a/Runtime/World/CScriptSound.hpp +++ b/Runtime/World/CScriptSound.hpp @@ -12,6 +12,8 @@ public: CScriptSound(TUniqueId, const std::string& name, const CEntityInfo& info, const zeus::CTransform& xf, s16 soundId, bool, float, float, float, u32, u32, u32, u32, u32, bool, bool, bool, bool, bool, bool, bool, bool, u32); + + void Accept(IVisitor& visitor); }; } diff --git a/Runtime/World/CScriptSpawnPoint.cpp b/Runtime/World/CScriptSpawnPoint.cpp index a51966d78..e5f76b146 100644 --- a/Runtime/World/CScriptSpawnPoint.cpp +++ b/Runtime/World/CScriptSpawnPoint.cpp @@ -2,6 +2,7 @@ #include "CStateManager.hpp" #include "CWorld.hpp" #include "CPlayer.hpp" +#include "TCastTo.hpp" namespace urde { @@ -15,6 +16,11 @@ CScriptSpawnPoint::CScriptSpawnPoint(TUniqueId uid, const std::string& name, con x10c_25_morphed = morphed; } +void CScriptSpawnPoint::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptSpawnPoint::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { CEntity::AcceptScriptMsg(msg, objId, stateMgr); diff --git a/Runtime/World/CScriptSpawnPoint.hpp b/Runtime/World/CScriptSpawnPoint.hpp index f3e8eb8be..b0b78fd5c 100644 --- a/Runtime/World/CScriptSpawnPoint.hpp +++ b/Runtime/World/CScriptSpawnPoint.hpp @@ -26,6 +26,7 @@ public: const zeus::CTransform& xf, const std::vector& itemCounts, bool, bool, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); bool FirstSpawn() const { return x10c_24_firstSpawn; } const zeus::CTransform& GetTransform() const { return x34_xf; } diff --git a/Runtime/World/CScriptSpecialFunction.cpp b/Runtime/World/CScriptSpecialFunction.cpp index de5be5b57..0b5e3e898 100644 --- a/Runtime/World/CScriptSpecialFunction.cpp +++ b/Runtime/World/CScriptSpecialFunction.cpp @@ -2,6 +2,7 @@ #include "Character/CModelData.hpp" #include "CActorParameters.hpp" #include "Audio/CSfxManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -35,6 +36,11 @@ CScriptSpecialFunction::CScriptSpecialFunction(TUniqueId uid, const std::string& x1c8_ = {{zeus::CVector3f(-1.f), zeus::CVector3f(1.f)}}; } +void CScriptSpecialFunction::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptSpecialFunction::Think(float, CStateManager &) { diff --git a/Runtime/World/CScriptSpecialFunction.hpp b/Runtime/World/CScriptSpecialFunction.hpp index 8498cae6a..8885350a4 100644 --- a/Runtime/World/CScriptSpecialFunction.hpp +++ b/Runtime/World/CScriptSpecialFunction.hpp @@ -113,6 +113,7 @@ public: const std::string&, float, float, float, float, const zeus::CVector3f&, const zeus::CColor&, bool, const CDamageInfo&, ResId, ResId, ResId, s16, s16, s16); + void Accept(IVisitor& visitor); void Think(float, CStateManager &); void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager &); void PreRender(const zeus::CFrustum &, const CStateManager &); diff --git a/Runtime/World/CScriptStreamedMusic.cpp b/Runtime/World/CScriptStreamedMusic.cpp new file mode 100644 index 000000000..e1210e294 --- /dev/null +++ b/Runtime/World/CScriptStreamedMusic.cpp @@ -0,0 +1,45 @@ +#include "CScriptStreamedMusic.hpp" +#include "CStringExtras.hpp" +#include "TCastTo.hpp" + +namespace urde +{ + +bool CScriptStreamedMusic::ValidateFileName(const std::string& fileName) +{ + if (!CStringExtras::CompareCaseInsensitive(fileName, "sw")) + return true; + if (CStringExtras::IndexOfSubstring(fileName, ".dsp") != -1) + return true; + return false; +} + +CScriptStreamedMusic::CScriptStreamedMusic(TUniqueId id, const CEntityInfo& info, const std::string& name, + bool active, const std::string& fileName, bool b1, float f1, float f2, + u32 w1, bool b2, bool b3) +: CEntity(id, info, active, name), x34_fileName(fileName), x44_b1(b1), + x45_fileNameValid(ValidateFileName(fileName)), x46_b2(b2), x47_b3(b3), + x48_f1(f1), x4c_f2(f2), x50_w1(w1) {} + +void CScriptStreamedMusic::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + +void CScriptStreamedMusic::PreThink(float, CStateManager&) +{ + +} + +void CScriptStreamedMusic::Think(float, CStateManager&) +{ + +} + +void CScriptStreamedMusic::AcceptScriptMsg(EScriptObjectMessage msg, + TUniqueId objId, CStateManager& stateMgr) +{ + +} + +} diff --git a/Runtime/World/CScriptStreamedMusic.hpp b/Runtime/World/CScriptStreamedMusic.hpp new file mode 100644 index 000000000..e1ce85bcc --- /dev/null +++ b/Runtime/World/CScriptStreamedMusic.hpp @@ -0,0 +1,38 @@ +#ifndef __URDE_CSCRIPTSTREAMEDMUSIC_HPP__ +#define __URDE_CSCRIPTSTREAMEDMUSIC_HPP__ + +#include "CEntity.hpp" + +namespace urde +{ + +class CScriptStreamedMusic : public CEntity +{ + std::string x34_fileName; + bool x44_b1; + bool x45_fileNameValid; + bool x46_b2; + bool x47_b3; + float x48_f1; + float x4c_f2; + u32 x50_w1; + static bool ValidateFileName(const std::string& fileName); + void StopStream(CStateManager& mgr); + void StartStream(CStateManager& mgr); + +public: + CScriptStreamedMusic(TUniqueId id, const CEntityInfo& info, const std::string& name, + bool, const std::string& fileName, bool, float, float, u32, + bool, bool); + + void Stop(CStateManager& mgr); + void Play(CStateManager& mgr); + void Accept(IVisitor& visitor); + void PreThink(float, CStateManager&); + void Think(float, CStateManager&); + void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr); +}; + +} + +#endif // __URDE_CSCRIPTSTREAMEDMUSIC_HPP__ diff --git a/Runtime/World/CScriptSwitch.cpp b/Runtime/World/CScriptSwitch.cpp index 3b387d978..19f11ab32 100644 --- a/Runtime/World/CScriptSwitch.cpp +++ b/Runtime/World/CScriptSwitch.cpp @@ -1,5 +1,6 @@ #include "CScriptSwitch.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -9,6 +10,11 @@ CScriptSwitch::CScriptSwitch(TUniqueId uid, const std::string& name, const CEnti { } +void CScriptSwitch::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptSwitch::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& mgr) { if (GetActive()) diff --git a/Runtime/World/CScriptSwitch.hpp b/Runtime/World/CScriptSwitch.hpp index 81c04ca31..95650a6ff 100644 --- a/Runtime/World/CScriptSwitch.hpp +++ b/Runtime/World/CScriptSwitch.hpp @@ -12,6 +12,7 @@ class CScriptSwitch : public CEntity public: CScriptSwitch(TUniqueId, const std::string&, const CEntityInfo&, bool, bool, bool); + void Accept(IVisitor& visitor); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); }; } diff --git a/Runtime/World/CScriptTimer.cpp b/Runtime/World/CScriptTimer.cpp index 62719733f..87ace9ab0 100644 --- a/Runtime/World/CScriptTimer.cpp +++ b/Runtime/World/CScriptTimer.cpp @@ -1,5 +1,6 @@ #include "CScriptTimer.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -16,6 +17,11 @@ CScriptTimer::CScriptTimer(TUniqueId uid, const std::string& name, const CEntity { } +void CScriptTimer::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + void CScriptTimer::Think(float dt, CStateManager& mgr) { if (GetActive() && IsTiming()) diff --git a/Runtime/World/CScriptTimer.hpp b/Runtime/World/CScriptTimer.hpp index 2c7f4b179..2ee2efefa 100644 --- a/Runtime/World/CScriptTimer.hpp +++ b/Runtime/World/CScriptTimer.hpp @@ -18,6 +18,7 @@ public: CScriptTimer(TUniqueId, const std::string& name, const CEntityInfo& info, float, float, bool, bool, bool); + void Accept(IVisitor& visitor); void Think(float, CStateManager &); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); bool IsTiming() const; diff --git a/Runtime/World/CScriptTrigger.cpp b/Runtime/World/CScriptTrigger.cpp index 5b455b7b0..ab68c7304 100644 --- a/Runtime/World/CScriptTrigger.cpp +++ b/Runtime/World/CScriptTrigger.cpp @@ -3,6 +3,7 @@ #include "CActorParameters.hpp" #include "Collision/CMaterialList.hpp" #include "CStateManager.hpp" +#include "TCastTo.hpp" namespace urde { @@ -23,6 +24,11 @@ CScriptTrigger::CScriptTrigger(TUniqueId uid, const std::string& name, const CEn { } +void CScriptTrigger::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + CScriptTrigger::CObjectTracker* CScriptTrigger::FindInhabitant(TUniqueId id) { const auto& iter = std::find(xe8_inhabitants.begin(), xe8_inhabitants.end(), id); diff --git a/Runtime/World/CScriptTrigger.hpp b/Runtime/World/CScriptTrigger.hpp index dcaec01e9..f241c695a 100644 --- a/Runtime/World/CScriptTrigger.hpp +++ b/Runtime/World/CScriptTrigger.hpp @@ -71,6 +71,7 @@ public: const zeus::CAABox&, const CDamageInfo& dInfo, const zeus::CVector3f& orientedForce, ETriggerFlags triggerFlags, bool, bool, bool); + void Accept(IVisitor& visitor); virtual void InhabitantRejected(CActor&, CStateManager&) {} virtual void InhabitantExited(CActor&, CStateManager&) {} virtual void InhabitantIdle(CActor&, CStateManager&) {} diff --git a/Runtime/World/CScriptWaypoint.cpp b/Runtime/World/CScriptWaypoint.cpp index c85e1eafa..dfe979712 100644 --- a/Runtime/World/CScriptWaypoint.cpp +++ b/Runtime/World/CScriptWaypoint.cpp @@ -2,6 +2,7 @@ #include "Character/CModelData.hpp" #include "Collision/CMaterialList.hpp" #include "CActorParameters.hpp" +#include "TCastTo.hpp" namespace urde { @@ -14,4 +15,9 @@ CScriptWaypoint::CScriptWaypoint(TUniqueId uid, const std::string& name, const C { } +void CScriptWaypoint::Accept(IVisitor& visitor) +{ + visitor.Visit(this); +} + } diff --git a/Runtime/World/CScriptWaypoint.hpp b/Runtime/World/CScriptWaypoint.hpp index f79d54e99..25165fba6 100644 --- a/Runtime/World/CScriptWaypoint.hpp +++ b/Runtime/World/CScriptWaypoint.hpp @@ -13,6 +13,8 @@ public: const zeus::CTransform&, bool, float, float, u32, u32, u32, u32, u32, u32, u32); + void Accept(IVisitor& visitor); + const CScriptWaypoint* NextWaypoint(CStateManager&) const { return nullptr; } }; } diff --git a/Runtime/World/ScriptLoader.cpp b/Runtime/World/ScriptLoader.cpp index 86dbfb462..3259488f2 100644 --- a/Runtime/World/ScriptLoader.cpp +++ b/Runtime/World/ScriptLoader.cpp @@ -60,6 +60,7 @@ #include "MP1/CWarWasp.hpp" #include "MP1/CSpacePirate.hpp" #include "CScriptShadowProjector.hpp" +#include "CScriptStreamedMusic.hpp" #include "CPatternedInfo.hpp" #include "CSimplePool.hpp" #include "Collision/CCollidableOBBTreeGroup.hpp" @@ -1797,9 +1798,22 @@ CEntity* ScriptLoader::LoadMidi(CStateManager& mgr, CInputStream& in, int propCo return nullptr; } -CEntity* ScriptLoader::LoadStreamedAudio(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) +CEntity* ScriptLoader::LoadStreamedMusic(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) { - return nullptr; + if (!EnsurePropertyCount(propCount, 9, "StreamedAudio")) + return nullptr; + + const std::string* name = mgr.HashInstanceName(in); + bool b1 = in.readBool(); + std::string fileName = in.readString(); + bool b2 = in.readBool(); + float f1 = in.readFloatBig(); + float f2 = in.readFloatBig(); + u32 w1 = in.readUint32Big(); + u32 w2 = in.readUint32Big(); + bool b3 = in.readBool(); + + return new CScriptStreamedMusic(mgr.AllocateUniqueId(), info, *name, b1, fileName, b2, f1, f2, w1, !w2, b3); } CEntity* ScriptLoader::LoadRepulsor(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) diff --git a/Runtime/World/ScriptLoader.hpp b/Runtime/World/ScriptLoader.hpp index cd74d4998..21491839f 100644 --- a/Runtime/World/ScriptLoader.hpp +++ b/Runtime/World/ScriptLoader.hpp @@ -123,7 +123,7 @@ public: static CEntity* LoadColorModulate(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info); static CEntity* LoadThardusRockProjectile(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info); static CEntity* LoadMidi(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info); - static CEntity* LoadStreamedAudio(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info); + static CEntity* LoadStreamedMusic(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info); static CEntity* LoadRepulsor(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info); static CEntity* LoadGunTurret(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info); static CEntity* LoadFogVolume(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info);