2016-04-13 06:07:23 +00:00
|
|
|
#ifndef __URDE_MP1_HPP__
|
|
|
|
#define __URDE_MP1_HPP__
|
2015-08-27 00:23:46 +00:00
|
|
|
|
2016-04-15 20:42:40 +00:00
|
|
|
#define MP1_USE_BOO 0
|
|
|
|
|
2016-09-17 06:40:45 +00:00
|
|
|
#include "IMain.hpp"
|
2015-08-27 00:23:46 +00:00
|
|
|
#include "CTweaks.hpp"
|
|
|
|
#include "CPlayMovie.hpp"
|
2015-11-02 18:45:39 +00:00
|
|
|
#include "IOStreams.hpp"
|
2016-04-15 20:42:40 +00:00
|
|
|
#include "CBasics.hpp"
|
|
|
|
#include "CMemoryCardSys.hpp"
|
|
|
|
#include "CResFactory.hpp"
|
|
|
|
#include "CSimplePool.hpp"
|
|
|
|
#include "Character/CAssetFactory.hpp"
|
2016-04-16 23:48:29 +00:00
|
|
|
#include "World/CAi.hpp"
|
2016-04-15 20:42:40 +00:00
|
|
|
#include "CGameState.hpp"
|
|
|
|
#include "CInGameTweakManager.hpp"
|
|
|
|
#include "Particle/CElementGen.hpp"
|
|
|
|
#include "Character/CAnimData.hpp"
|
|
|
|
#include "Particle/CDecalManager.hpp"
|
|
|
|
#include "Particle/CGenDescription.hpp"
|
|
|
|
#include "Graphics/CBooRenderer.hpp"
|
|
|
|
#include "Audio/CAudioSys.hpp"
|
|
|
|
#include "Input/CInputGenerator.hpp"
|
|
|
|
#include "GuiSys/CGuiSys.hpp"
|
|
|
|
#include "CIOWinManager.hpp"
|
|
|
|
#include "GuiSys/CSplashScreen.hpp"
|
|
|
|
#include "CMainFlow.hpp"
|
|
|
|
#include "GuiSys/CConsoleOutputWindow.hpp"
|
2016-09-14 05:54:09 +00:00
|
|
|
#include "GuiSys/CErrorOutputWindow.hpp"
|
2016-04-15 20:42:40 +00:00
|
|
|
#include "GuiSys/CTextParser.hpp"
|
2017-01-22 01:40:12 +00:00
|
|
|
#include "CAudioStateWin.hpp"
|
2016-04-15 20:42:40 +00:00
|
|
|
#include "GameGlobalObjects.hpp"
|
|
|
|
#include "CArchitectureQueue.hpp"
|
|
|
|
#include "CTimeProvider.hpp"
|
|
|
|
#include "GuiSys/CTextExecuteBuffer.hpp"
|
|
|
|
#include "DataSpec/DNAMP1/Tweaks/CTweakPlayer.hpp"
|
|
|
|
#include "DataSpec/DNAMP1/Tweaks/CTweakGame.hpp"
|
2017-05-22 11:24:24 +00:00
|
|
|
#include "World/CScriptMazeNode.hpp"
|
2015-08-27 00:23:46 +00:00
|
|
|
|
2016-03-04 23:04:53 +00:00
|
|
|
namespace urde
|
2015-08-27 00:23:46 +00:00
|
|
|
{
|
2016-04-15 20:42:40 +00:00
|
|
|
class IFactory;
|
|
|
|
class IObjectStore;
|
2015-08-27 00:23:46 +00:00
|
|
|
|
|
|
|
namespace MP1
|
|
|
|
{
|
2016-09-30 22:43:19 +00:00
|
|
|
class CMain;
|
|
|
|
|
2016-04-15 20:42:40 +00:00
|
|
|
class CGameGlobalObjects
|
2015-11-02 18:45:39 +00:00
|
|
|
{
|
2016-12-30 06:37:01 +00:00
|
|
|
friend class CMain;
|
|
|
|
|
2016-09-25 16:45:22 +00:00
|
|
|
std::unique_ptr<CMemoryCardSys> x0_memoryCardSys;
|
2017-10-26 10:09:51 +00:00
|
|
|
std::unique_ptr<CResFactory> x4_gameResFactory;
|
|
|
|
IFactory* x4_resFactory;
|
|
|
|
std::unique_ptr<CSimplePool> x4_gameSimplePool;
|
|
|
|
CSimplePool* xcc_simplePool;
|
2016-09-04 22:47:48 +00:00
|
|
|
CCharacterFactoryBuilder xec_charFactoryBuilder;
|
|
|
|
CAiFuncMap x110_aiFuncMap;
|
2016-12-29 21:38:59 +00:00
|
|
|
std::unique_ptr<CGameState> x134_gameState;
|
2016-12-14 22:56:59 +00:00
|
|
|
TLockedToken<CStringTable> x13c_mainStringTable;
|
2016-09-04 22:47:48 +00:00
|
|
|
CInGameTweakManager x150_tweakManager;
|
2017-01-21 06:03:37 +00:00
|
|
|
std::unique_ptr<IRenderer> m_renderer;
|
2016-04-15 20:42:40 +00:00
|
|
|
|
|
|
|
void LoadStringTable()
|
|
|
|
{
|
2016-12-14 22:56:59 +00:00
|
|
|
x13c_mainStringTable = g_SimplePool->GetObj("STRG_Main");
|
|
|
|
g_MainStringTable = x13c_mainStringTable.GetObj();
|
2016-04-15 20:42:40 +00:00
|
|
|
}
|
2017-10-26 05:37:46 +00:00
|
|
|
void AddPaksAndFactories();
|
2017-01-21 06:03:37 +00:00
|
|
|
static IRenderer*
|
2016-04-15 20:42:40 +00:00
|
|
|
AllocateRenderer(IObjectStore& store, IFactory& resFactory)
|
|
|
|
{
|
|
|
|
g_Renderer = new CBooRenderer(store, resFactory);
|
|
|
|
return g_Renderer;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
2017-10-26 10:09:51 +00:00
|
|
|
CGameGlobalObjects(IFactory* resFactory,
|
|
|
|
CSimplePool* objStore)
|
2016-09-04 22:47:48 +00:00
|
|
|
: x4_resFactory(resFactory), xcc_simplePool(objStore)
|
2016-04-15 20:42:40 +00:00
|
|
|
{
|
2017-10-26 10:09:51 +00:00
|
|
|
if (!x4_resFactory)
|
|
|
|
{
|
|
|
|
x4_gameResFactory.reset(new CResFactory());
|
|
|
|
x4_resFactory = x4_gameResFactory.get();
|
|
|
|
}
|
|
|
|
if (!xcc_simplePool)
|
|
|
|
{
|
|
|
|
x4_gameSimplePool.reset(new CSimplePool(*x4_resFactory));
|
|
|
|
xcc_simplePool = x4_gameSimplePool.get();
|
|
|
|
}
|
|
|
|
g_ResFactory = x4_resFactory;
|
|
|
|
g_SimplePool = xcc_simplePool;
|
2016-09-04 22:47:48 +00:00
|
|
|
g_CharFactoryBuilder = &xec_charFactoryBuilder;
|
|
|
|
g_AiFuncMap = &x110_aiFuncMap;
|
2016-12-29 21:38:59 +00:00
|
|
|
x134_gameState.reset(new CGameState());
|
|
|
|
g_GameState = x134_gameState.get();
|
2016-09-04 22:47:48 +00:00
|
|
|
g_TweakManager = &x150_tweakManager;
|
2016-04-15 20:42:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void PostInitialize()
|
|
|
|
{
|
2017-10-26 05:37:46 +00:00
|
|
|
AddPaksAndFactories();
|
2017-10-26 10:09:51 +00:00
|
|
|
x4_resFactory->LoadOriginalIDs(*xcc_simplePool);
|
2016-04-15 20:42:40 +00:00
|
|
|
LoadStringTable();
|
2017-10-26 10:09:51 +00:00
|
|
|
m_renderer.reset(AllocateRenderer(*xcc_simplePool, *x4_resFactory));
|
2017-05-22 11:24:24 +00:00
|
|
|
CScriptMazeNode::LoadMazeSeeds();
|
2016-04-15 20:42:40 +00:00
|
|
|
}
|
2016-09-30 22:43:19 +00:00
|
|
|
|
2016-12-29 21:38:59 +00:00
|
|
|
void ResetGameState()
|
|
|
|
{
|
|
|
|
x134_gameState.reset(new CGameState());
|
|
|
|
g_GameState = x134_gameState.get();
|
|
|
|
}
|
2015-11-02 18:45:39 +00:00
|
|
|
};
|
|
|
|
|
2016-04-15 20:42:40 +00:00
|
|
|
#if MP1_USE_BOO
|
|
|
|
class CGameArchitectureSupport : public boo::IWindowCallback
|
|
|
|
#else
|
|
|
|
class CGameArchitectureSupport
|
|
|
|
#endif
|
|
|
|
{
|
2016-09-30 22:43:19 +00:00
|
|
|
CMain& m_parent;
|
2016-12-29 21:38:59 +00:00
|
|
|
CArchitectureQueue x4_archQueue;
|
|
|
|
CAudioSys x0_audioSys;
|
|
|
|
CInputGenerator x30_inputGenerator;
|
|
|
|
CGuiSys x44_guiSys;
|
|
|
|
CIOWinManager x58_ioWinManager;
|
2017-02-18 02:19:50 +00:00
|
|
|
s32 x78_gameFrameCount;
|
2017-01-20 03:53:32 +00:00
|
|
|
|
|
|
|
enum class EAudioLoadStatus
|
|
|
|
{
|
|
|
|
Loading,
|
|
|
|
Loaded,
|
|
|
|
Uninitialized
|
|
|
|
};
|
|
|
|
EAudioLoadStatus x88_audioLoadStatus = EAudioLoadStatus::Uninitialized;
|
|
|
|
std::vector<TToken<CAudioGroupSet>> x8c_pendingAudioGroups;
|
|
|
|
|
2016-04-15 20:42:40 +00:00
|
|
|
boo::SWindowRect m_windowRect;
|
|
|
|
bool m_rectIsDirty;
|
|
|
|
|
2017-01-22 21:26:58 +00:00
|
|
|
void destroyed() { x4_archQueue.Push(MakeMsg::CreateApplicationExit(EArchMsgTarget::ArchitectureSupport)); }
|
|
|
|
|
|
|
|
void resized(const boo::SWindowRect &rect)
|
|
|
|
{
|
|
|
|
m_windowRect = rect;
|
|
|
|
m_rectIsDirty = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
2017-02-09 09:23:17 +00:00
|
|
|
CGameArchitectureSupport(CMain& parent,
|
|
|
|
boo::IAudioVoiceEngine* voiceEngine,
|
2017-01-22 21:26:58 +00:00
|
|
|
amuse::IBackendVoiceAllocator& backend);
|
|
|
|
~CGameArchitectureSupport();
|
|
|
|
|
2016-04-15 20:42:40 +00:00
|
|
|
void mouseDown(const boo::SWindowCoord &coord, boo::EMouseButton button, boo::EModifierKey mods)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.mouseDown(coord, button, mods); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void mouseUp(const boo::SWindowCoord &coord, boo::EMouseButton button, boo::EModifierKey mods)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.mouseUp(coord, button, mods); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void mouseMove(const boo::SWindowCoord &coord)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.mouseMove(coord); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void scroll(const boo::SWindowCoord &coord, const boo::SScrollDelta &scroll)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.scroll(coord, scroll); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void charKeyDown(unsigned long charCode, boo::EModifierKey mods, bool isRepeat)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.charKeyDown(charCode, mods, isRepeat); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void charKeyUp(unsigned long charCode, boo::EModifierKey mods)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.charKeyUp(charCode, mods); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void specialKeyDown(boo::ESpecialKey key, boo::EModifierKey mods, bool isRepeat)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.specialKeyDown(key, mods, isRepeat); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void specialKeyUp(boo::ESpecialKey key, boo::EModifierKey mods)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.specialKeyUp(key, mods); }
|
2016-04-15 20:42:40 +00:00
|
|
|
void modKeyDown(boo::EModifierKey mod, bool isRepeat)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.modKeyDown(mod, isRepeat);}
|
2016-04-15 20:42:40 +00:00
|
|
|
void modKeyUp(boo::EModifierKey mod)
|
2016-12-29 21:38:59 +00:00
|
|
|
{ x30_inputGenerator.modKeyUp(mod); }
|
2016-04-15 20:42:40 +00:00
|
|
|
|
2016-09-15 07:26:35 +00:00
|
|
|
void PreloadAudio();
|
2017-01-20 03:53:32 +00:00
|
|
|
bool LoadAudio();
|
2017-01-22 01:40:12 +00:00
|
|
|
void UnloadAudio();
|
2017-01-20 03:53:32 +00:00
|
|
|
void UpdateTicks();
|
|
|
|
void Update();
|
2016-09-14 05:54:09 +00:00
|
|
|
void Draw();
|
2016-04-15 20:42:40 +00:00
|
|
|
|
|
|
|
bool isRectDirty() { return m_rectIsDirty; }
|
|
|
|
const boo::SWindowRect& getWindowRect()
|
|
|
|
{
|
|
|
|
m_rectIsDirty = false;
|
|
|
|
return m_windowRect;
|
|
|
|
}
|
2017-02-06 03:21:58 +00:00
|
|
|
|
|
|
|
CIOWinManager& GetIOWinManager() { return x58_ioWinManager; }
|
2016-04-15 20:42:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#if MP1_USE_BOO
|
2016-09-17 06:40:45 +00:00
|
|
|
class CMain : public boo::IApplicationCallback, public IMain
|
2016-04-15 20:42:40 +00:00
|
|
|
#else
|
2016-09-17 06:40:45 +00:00
|
|
|
class CMain : public IMain
|
2016-04-15 20:42:40 +00:00
|
|
|
#endif
|
2016-03-04 05:28:20 +00:00
|
|
|
{
|
2016-09-30 22:43:19 +00:00
|
|
|
friend class CGameArchitectureSupport;
|
2016-04-15 20:42:40 +00:00
|
|
|
#if MP1_USE_BOO
|
2015-11-02 18:45:39 +00:00
|
|
|
boo::IWindow* mainWindow;
|
|
|
|
int appMain(boo::IApplication* app);
|
2015-08-28 00:11:31 +00:00
|
|
|
void appQuitting(boo::IApplication*)
|
2015-11-09 03:43:11 +00:00
|
|
|
{ xe8_b24_finished = true; }
|
2015-08-28 00:11:31 +00:00
|
|
|
void appFilesOpen(boo::IApplication*, const std::vector<std::string>& paths)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "OPENING: ");
|
|
|
|
for (const std::string& path : paths)
|
|
|
|
fprintf(stderr, "%s ", path.c_str());
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
}
|
2016-04-15 20:42:40 +00:00
|
|
|
#endif
|
2016-08-15 20:58:07 +00:00
|
|
|
private:
|
2015-08-28 00:11:31 +00:00
|
|
|
|
2016-08-17 06:18:18 +00:00
|
|
|
struct BooSetter
|
|
|
|
{
|
|
|
|
BooSetter(boo::IGraphicsDataFactory* factory,
|
|
|
|
boo::IGraphicsCommandQueue* cmdQ,
|
|
|
|
boo::ITextureR* spareTex);
|
|
|
|
} m_booSetter;
|
|
|
|
|
2016-04-15 20:42:40 +00:00
|
|
|
//CMemorySys x6c_memSys;
|
2015-08-27 00:23:46 +00:00
|
|
|
CTweaks x70_tweaks;
|
|
|
|
EGameplayResult xe4_gameplayResult;
|
2015-08-28 00:11:31 +00:00
|
|
|
|
2016-04-15 20:42:40 +00:00
|
|
|
/* urde addition: these are simply initialized along with everything else */
|
2016-08-15 20:58:07 +00:00
|
|
|
CGameGlobalObjects x128_globalObjects;
|
2016-04-15 20:42:40 +00:00
|
|
|
|
2017-03-30 22:36:18 +00:00
|
|
|
EFlowState x12c_flowState = EFlowState::Default;
|
2016-08-15 20:58:07 +00:00
|
|
|
|
|
|
|
u32 x130_[10] = { 1000000 };
|
|
|
|
|
|
|
|
union
|
|
|
|
{
|
|
|
|
struct
|
|
|
|
{
|
2017-01-20 03:53:32 +00:00
|
|
|
bool x160_24_finished : 1;
|
2017-02-18 02:19:50 +00:00
|
|
|
bool x160_25_mfGameBuilt : 1;
|
|
|
|
bool x160_26_screenFading : 1;
|
2016-08-15 20:58:07 +00:00
|
|
|
bool x160_27_ : 1;
|
2016-12-30 06:37:01 +00:00
|
|
|
bool x160_28_manageCard : 1;
|
2016-08-15 20:58:07 +00:00
|
|
|
bool x160_29_ : 1;
|
|
|
|
bool x160_30_ : 1;
|
2016-12-24 05:23:50 +00:00
|
|
|
bool x160_31_cardBusy : 1;
|
2017-02-18 02:19:50 +00:00
|
|
|
bool x161_24_gameFrameDrawn : 1;
|
2016-08-15 20:58:07 +00:00
|
|
|
};
|
|
|
|
u16 _dummy = 0;
|
|
|
|
};
|
|
|
|
|
2017-01-20 03:53:32 +00:00
|
|
|
std::unique_ptr<CGameArchitectureSupport> x164_archSupport;
|
2016-08-15 20:58:07 +00:00
|
|
|
|
2017-02-09 09:23:17 +00:00
|
|
|
boo::IWindow* m_mainWindow = nullptr;
|
|
|
|
|
2017-10-17 05:51:53 +00:00
|
|
|
// Warmup state
|
|
|
|
std::vector<SObjectTag> m_warmupTags;
|
|
|
|
std::vector<SObjectTag>::iterator m_warmupIt;
|
2017-10-22 06:11:22 +00:00
|
|
|
bool m_needsWarmupClear = false;
|
2017-10-17 05:51:53 +00:00
|
|
|
|
2016-12-14 22:56:59 +00:00
|
|
|
void InitializeSubsystems(const hecl::Runtime::FileStoreManager& storeMgr);
|
2016-04-15 20:42:40 +00:00
|
|
|
|
2015-08-27 00:23:46 +00:00
|
|
|
public:
|
2017-10-26 10:09:51 +00:00
|
|
|
CMain(IFactory* resFactory, CSimplePool* resStore,
|
2016-08-17 06:18:18 +00:00
|
|
|
boo::IGraphicsDataFactory* gfxFactory,
|
|
|
|
boo::IGraphicsCommandQueue* cmdQ,
|
2016-09-15 07:26:35 +00:00
|
|
|
boo::ITextureR* spareTex);
|
2015-08-27 00:23:46 +00:00
|
|
|
void RegisterResourceTweaks();
|
2017-10-26 05:37:46 +00:00
|
|
|
void AddWorldPaks();
|
2015-08-27 00:23:46 +00:00
|
|
|
void ResetGameState();
|
2016-12-30 06:37:01 +00:00
|
|
|
void StreamNewGameState(CBitStreamReader&, u32 idx);
|
2015-08-27 00:23:46 +00:00
|
|
|
void CheckTweakManagerDebugOptions() {}
|
2017-02-18 02:19:50 +00:00
|
|
|
void SetMFGameBuilt(bool b) { x160_25_mfGameBuilt = b; }
|
|
|
|
void SetScreenFading(bool b) { x160_26_screenFading = b; }
|
2016-04-15 20:42:40 +00:00
|
|
|
|
|
|
|
//int RsMain(int argc, const boo::SystemChar* argv[]);
|
2016-08-17 06:18:18 +00:00
|
|
|
void Init(const hecl::Runtime::FileStoreManager& storeMgr,
|
2017-02-09 09:23:17 +00:00
|
|
|
boo::IWindow* window,
|
2016-09-15 07:26:35 +00:00
|
|
|
boo::IAudioVoiceEngine* voiceEngine,
|
|
|
|
amuse::IBackendVoiceAllocator& backend);
|
2017-10-17 05:51:53 +00:00
|
|
|
void WarmupShaders();
|
2016-04-15 20:42:40 +00:00
|
|
|
bool Proc();
|
2016-09-14 05:54:09 +00:00
|
|
|
void Draw();
|
2016-04-15 20:42:40 +00:00
|
|
|
void Shutdown();
|
2017-02-09 09:23:17 +00:00
|
|
|
boo::IWindow* GetMainWindow() const;
|
2016-04-15 20:42:40 +00:00
|
|
|
|
2017-10-22 06:11:22 +00:00
|
|
|
void MemoryCardInitializePump();
|
2017-01-20 03:53:32 +00:00
|
|
|
|
2016-09-17 06:40:45 +00:00
|
|
|
bool CheckReset() { return false; }
|
2016-12-30 06:37:01 +00:00
|
|
|
bool CheckTerminate() { return false; }
|
2016-09-17 06:40:45 +00:00
|
|
|
void DrawDebugMetrics(double, CStopWatch&) {}
|
2015-08-27 00:23:46 +00:00
|
|
|
void DoPredrawMetrics() {}
|
|
|
|
void FillInAssetIDs();
|
2017-01-20 03:53:32 +00:00
|
|
|
bool LoadAudio();
|
2017-01-22 01:40:12 +00:00
|
|
|
void ShutdownSubsystems();
|
2016-12-30 06:37:01 +00:00
|
|
|
EGameplayResult GetGameplayResult() const { return xe4_gameplayResult; }
|
|
|
|
void SetGameplayResult(EGameplayResult wl) { xe4_gameplayResult = wl; }
|
|
|
|
void SetManageCard(bool v) { x160_28_manageCard = v; }
|
2017-01-09 03:44:00 +00:00
|
|
|
bool GetCardBusy() const { return x160_31_cardBusy; }
|
2016-12-30 06:37:01 +00:00
|
|
|
void SetCardBusy(bool v) { x160_31_cardBusy = v; }
|
2017-02-18 02:19:50 +00:00
|
|
|
void SetGameFrameDrawn() { x161_24_gameFrameDrawn = true; }
|
2017-04-15 05:32:25 +00:00
|
|
|
static void EnsureWorldPaksReady();
|
2017-08-13 05:26:14 +00:00
|
|
|
static void EnsureWorldPakReady(CAssetId mlvl);
|
2016-08-15 20:58:07 +00:00
|
|
|
|
2016-09-17 06:40:45 +00:00
|
|
|
EFlowState GetFlowState() const { return x12c_flowState; }
|
2017-01-17 01:23:19 +00:00
|
|
|
void SetFlowState(EFlowState s) { x12c_flowState = s; }
|
|
|
|
|
|
|
|
void SetX30(bool v) { x160_30_ = v; }
|
2017-01-22 21:26:58 +00:00
|
|
|
|
|
|
|
CGameArchitectureSupport* GetArchSupport() const { return x164_archSupport.get(); }
|
2017-08-13 05:26:14 +00:00
|
|
|
|
|
|
|
size_t GetExpectedIdSize() const { return sizeof(u32); }
|
2015-08-27 00:23:46 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-13 06:07:23 +00:00
|
|
|
#endif // __URDE_MP1_HPP__
|