metaforce/Runtime/CArchitectureMessage.hpp

182 lines
5.3 KiB
C++
Raw Normal View History

2018-10-07 03:42:33 +00:00
#pragma once
2015-08-20 02:52:07 +00:00
#include "GCNTypes.hpp"
#include "Input/CFinalInput.hpp"
2015-08-26 01:34:56 +00:00
#include "rstl.hpp"
2015-08-20 02:52:07 +00:00
2016-03-04 23:04:53 +00:00
namespace urde
2015-08-20 02:52:07 +00:00
{
class CIOWin;
2015-11-21 01:16:07 +00:00
enum class EArchMsgTarget
2015-08-20 02:52:07 +00:00
{
2015-11-21 01:16:07 +00:00
IOWinManager = 0,
2016-02-20 06:45:36 +00:00
Game = 1,
2015-08-20 02:52:07 +00:00
};
2015-11-21 01:16:07 +00:00
enum class EArchMsgType
2015-08-20 02:52:07 +00:00
{
2015-11-21 01:16:07 +00:00
RemoveIOWin = 0,
CreateIOWin = 1,
ChangeIOWinPriority = 2,
RemoveAllIOWins = 3,
TimerTick = 4,
UserInput = 5,
SetGameState = 6,
ControllerStatus = 7,
QuitGameplay = 8,
2017-02-18 02:19:50 +00:00
FrameBegin = 10,
FrameEnd = 11,
2015-08-20 02:52:07 +00:00
};
struct IArchMsgParm
{
virtual ~IArchMsgParm() = default;
2015-08-20 02:52:07 +00:00
};
struct CArchMsgParmInt32 : IArchMsgParm
{
2015-08-26 01:34:56 +00:00
u32 x4_parm;
CArchMsgParmInt32(u32 parm) : x4_parm(parm) {}
};
struct CArchMsgParmVoidPtr : IArchMsgParm
{
void* x4_parm1;
CArchMsgParmVoidPtr(void* parm1) : x4_parm1(parm1) {}
2015-08-20 02:52:07 +00:00
};
struct CArchMsgParmInt32Int32VoidPtr : IArchMsgParm
{
2015-08-26 01:34:56 +00:00
u32 x4_parm1;
u32 x8_parm2;
void* xc_parm3;
CArchMsgParmInt32Int32VoidPtr(u32 parm1, u32 parm2, void* parm3)
: x4_parm1(parm1), x8_parm2(parm2), xc_parm3(parm3) {}
};
struct CArchMsgParmInt32Int32IOWin : IArchMsgParm
{
u32 x4_parm1;
u32 x8_parm2;
std::shared_ptr<CIOWin> xc_parm3;
CArchMsgParmInt32Int32IOWin(u32 parm1, u32 parm2, std::shared_ptr<CIOWin>&& parm3)
: x4_parm1(parm1), x8_parm2(parm2), xc_parm3(std::move(parm3)) {}
2015-08-20 02:52:07 +00:00
};
struct CArchMsgParmNull : IArchMsgParm
{
};
struct CArchMsgParmReal32 : IArchMsgParm
{
2015-08-26 01:34:56 +00:00
float x4_parm;
CArchMsgParmReal32(float parm) : x4_parm(parm) {}
2015-08-20 02:52:07 +00:00
};
struct CArchMsgParmUserInput : IArchMsgParm
{
2015-08-26 01:34:56 +00:00
CFinalInput x4_parm;
CArchMsgParmUserInput(const CFinalInput& parm) : x4_parm(parm) {}
2015-08-20 02:52:07 +00:00
};
struct CArchMsgParmControllerStatus : IArchMsgParm
{
2015-08-26 01:34:56 +00:00
u16 x4_parm1;
bool x6_parm2;
CArchMsgParmControllerStatus(u16 a, bool b) : x4_parm1(a), x6_parm2(b) {}
2015-08-20 02:52:07 +00:00
};
class CArchitectureMessage
{
2015-08-26 01:34:56 +00:00
EArchMsgTarget x0_target;
EArchMsgType x4_type;
std::shared_ptr<IArchMsgParm> x8_parm;
2015-08-20 02:52:07 +00:00
public:
CArchitectureMessage(EArchMsgTarget target, EArchMsgType type,
std::shared_ptr<IArchMsgParm>&& parm)
: x0_target(target), x4_type(type), x8_parm(std::move(parm)) {}
2015-08-20 02:52:07 +00:00
EArchMsgTarget GetTarget() const { return x0_target; }
EArchMsgType GetType() const { return x4_type; }
2015-08-20 02:52:07 +00:00
template <class T>
const T* GetParm() const
{
2018-10-07 02:59:17 +00:00
return static_cast<T*>(x8_parm.get());
}
2015-08-20 02:52:07 +00:00
};
class MakeMsg
{
public:
static CArchitectureMessage CreateQuitGameplay(EArchMsgTarget target)
{
return CArchitectureMessage(target, EArchMsgType::QuitGameplay,
std::make_shared<CArchMsgParmNull>());
2015-08-20 02:52:07 +00:00
}
static CArchitectureMessage CreateControllerStatus(EArchMsgTarget target, u16 a, bool b)
{
return CArchitectureMessage(target, EArchMsgType::ControllerStatus,
std::make_shared<CArchMsgParmControllerStatus>(a, b));
2015-08-20 02:52:07 +00:00
}
static const CArchMsgParmInt32& GetParmNewGameflowState(const CArchitectureMessage& msg)
{
return *msg.GetParm<CArchMsgParmInt32>();
}
static const CArchMsgParmUserInput& GetParmUserInput(const CArchitectureMessage& msg)
{
return *msg.GetParm<CArchMsgParmUserInput>();
}
static CArchitectureMessage CreateUserInput(EArchMsgTarget target, const CFinalInput& input)
{
return CArchitectureMessage(target, EArchMsgType::UserInput,
std::make_shared<CArchMsgParmUserInput>(input));
2015-08-20 02:52:07 +00:00
}
static const CArchMsgParmReal32& GetParmTimerTick(const CArchitectureMessage& msg)
{
return *msg.GetParm<CArchMsgParmReal32>();
}
static CArchitectureMessage CreateTimerTick(EArchMsgTarget target, float val)
{
return CArchitectureMessage(target, EArchMsgType::TimerTick,
std::make_shared<CArchMsgParmReal32>(val));
2015-08-20 02:52:07 +00:00
}
static const CArchMsgParmInt32Int32VoidPtr& GetParmChangeIOWinPriority(const CArchitectureMessage& msg)
{
return *msg.GetParm<CArchMsgParmInt32Int32VoidPtr>();
}
static const CArchMsgParmInt32Int32IOWin& GetParmCreateIOWin(const CArchitectureMessage& msg)
2015-08-20 02:52:07 +00:00
{
return *msg.GetParm<CArchMsgParmInt32Int32IOWin>();
2015-08-20 02:52:07 +00:00
}
static CArchitectureMessage CreateCreateIOWin(EArchMsgTarget target, int pmin, int pmax,
std::shared_ptr<CIOWin>&& iowin)
2015-08-20 02:52:07 +00:00
{
return CArchitectureMessage(target, EArchMsgType::CreateIOWin,
std::make_shared<CArchMsgParmInt32Int32IOWin>(pmin, pmax, std::move(iowin)));
2015-08-20 02:52:07 +00:00
}
2015-08-26 01:34:56 +00:00
static const CArchMsgParmVoidPtr& GetParmDeleteIOWin(const CArchitectureMessage& msg)
2015-08-20 02:52:07 +00:00
{
2015-08-26 01:34:56 +00:00
return *msg.GetParm<CArchMsgParmVoidPtr>();
2015-08-20 02:52:07 +00:00
}
2017-02-18 02:19:50 +00:00
static CArchitectureMessage CreateFrameBegin(EArchMsgTarget target, const s32& a)
2016-09-02 17:50:03 +00:00
{
return CArchitectureMessage(target, EArchMsgType::FrameBegin,
std::make_shared<CArchMsgParmInt32>(a));
2016-09-02 17:50:03 +00:00
}
2017-02-18 02:19:50 +00:00
static CArchitectureMessage CreateFrameEnd(EArchMsgTarget target, const s32& a)
{
return CArchitectureMessage(target, EArchMsgType::FrameEnd,
std::make_shared<CArchMsgParmInt32>(a));
}
2016-03-04 23:04:53 +00:00
/* URDE Messages */
2018-01-15 16:00:20 +00:00
static CArchitectureMessage CreateRemoveAllIOWins(EArchMsgTarget target)
2016-02-20 06:45:36 +00:00
{
2018-01-15 16:00:20 +00:00
return CArchitectureMessage(target, EArchMsgType::RemoveAllIOWins,
std::make_shared<CArchMsgParmNull>());
2016-02-20 06:45:36 +00:00
}
2015-08-20 02:52:07 +00:00
};
}