mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-23 08:24:16 +00:00
Implement LegoControlManager (#500)
* Push changes * Update score.cpp * fix * Update score.h * Fixes/matches --------- Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
@@ -1,44 +1,118 @@
|
||||
#include "legocontrolmanager.h"
|
||||
|
||||
#include "legoeventnotificationparam.h"
|
||||
#include "mxcontrolpresenter.h"
|
||||
#include "mxpresenter.h"
|
||||
#include "mxticklemanager.h"
|
||||
|
||||
DECOMP_SIZE_ASSERT(LegoControlManager, 0x60);
|
||||
DECOMP_SIZE_ASSERT(LegoControlManager, 0x60)
|
||||
DECOMP_SIZE_ASSERT(LegoControlManagerEvent, 0x2c)
|
||||
|
||||
// STUB: LEGO1 0x10028520
|
||||
// FUNCTION: LEGO1 0x10028520
|
||||
LegoControlManager::LegoControlManager()
|
||||
{
|
||||
// TODO
|
||||
m_presenterList = NULL;
|
||||
m_unk0x08 = 0;
|
||||
m_unk0x0c = 0;
|
||||
m_unk0x10 = FALSE;
|
||||
m_unk0x14 = NULL;
|
||||
TickleManager()->RegisterClient(this, 10);
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10028d60
|
||||
// FUNCTION: LEGO1 0x10028d60
|
||||
LegoControlManager::~LegoControlManager()
|
||||
{
|
||||
// TODO
|
||||
TickleManager()->UnregisterClient(this);
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10028df0
|
||||
// FUNCTION: LEGO1 0x10028df0
|
||||
void LegoControlManager::FUN_10028df0(MxPresenterList* p_presenterList)
|
||||
{
|
||||
// TODO
|
||||
m_presenterList = p_presenterList;
|
||||
g_unk0x100f31b0 = -1;
|
||||
g_unk0x100f31b4 = NULL;
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10028e10
|
||||
// FUNCTION: LEGO1 0x10028e10
|
||||
void LegoControlManager::Register(MxCore* p_listener)
|
||||
{
|
||||
// TODO
|
||||
m_notifyList.Append(p_listener);
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10028ea0
|
||||
// FUNCTION: LEGO1 0x10028ea0
|
||||
void LegoControlManager::Unregister(MxCore* p_listener)
|
||||
{
|
||||
// TODO
|
||||
LegoNotifyListCursor cursor(&m_notifyList);
|
||||
if (cursor.Find(p_listener))
|
||||
cursor.Detach();
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10029210
|
||||
// FUNCTION: LEGO1 0x10029210
|
||||
MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter)
|
||||
{
|
||||
return TRUE;
|
||||
if (m_presenterList != NULL && m_presenterList->GetCount() != 0) {
|
||||
m_unk0x14 = p_presenter;
|
||||
|
||||
if (p_param.GetType() == c_notificationButtonUp || p_param.GetType() == c_notificationButtonDown) {
|
||||
m_event.SetType(p_param.GetType());
|
||||
m_event.SetSender(p_param.GetSender());
|
||||
m_event.SetModifier(p_param.GetModifier());
|
||||
m_event.SetX(p_param.GetX());
|
||||
m_event.SetY(p_param.GetY());
|
||||
m_event.SetKey(p_param.GetKey());
|
||||
|
||||
if (p_param.GetType() == c_notificationButtonUp) {
|
||||
if (m_unk0x10 == TRUE) {
|
||||
m_unk0x10 = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (g_unk0x100f31b0 != -1 && g_unk0x100f31b4 != NULL) {
|
||||
if (m_unk0x08 == 2) {
|
||||
return FUN_10029750();
|
||||
}
|
||||
else {
|
||||
m_unk0x0c = 1;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (p_param.GetType() == c_notificationButtonDown) {
|
||||
if (m_unk0x0c == 1) {
|
||||
m_unk0x10 = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
return FUN_10029630();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
else {
|
||||
g_unk0x100f31b0 = -1;
|
||||
g_unk0x100f31b4 = NULL;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100292e0
|
||||
void LegoControlManager::FUN_100292e0()
|
||||
{
|
||||
LegoNotifyListCursor cursor(&m_notifyList);
|
||||
MxCore* target;
|
||||
|
||||
// The usual cursor.Next() loop doesn't match here, even though
|
||||
// the logic is the same. It does match when "deconstructed" into
|
||||
// the following Head(), Current() and NextFragment() calls,
|
||||
// but this seems unlikely to be the original code.
|
||||
cursor.Head();
|
||||
while (cursor.Current(target)) {
|
||||
cursor.NextFragment();
|
||||
target->Notify(m_event);
|
||||
}
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x100293c0
|
||||
@@ -46,10 +120,68 @@ void LegoControlManager::FUN_100293c0(undefined4, const char*, undefined2)
|
||||
{
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10029600
|
||||
// STUB: LEGO1 0x100294e0
|
||||
void LegoControlManager::FUN_100294e0(MxS32 p_x, MxS32 p_y)
|
||||
{
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10029600
|
||||
MxResult LegoControlManager::Tickle()
|
||||
{
|
||||
// TODO
|
||||
|
||||
if (m_unk0x08 == 2 && m_unk0x0c == 1) {
|
||||
m_event.SetType(c_notificationButtonUp);
|
||||
FUN_10029750();
|
||||
return 0;
|
||||
}
|
||||
else if (m_unk0x08 == 1) {
|
||||
m_unk0x08 = 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10029630
|
||||
MxBool LegoControlManager::FUN_10029630()
|
||||
{
|
||||
MxPresenterListCursor cursor(m_presenterList);
|
||||
MxPresenter* presenter;
|
||||
|
||||
while (cursor.Next(presenter)) {
|
||||
if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) {
|
||||
g_unk0x100f31b0 = m_event.GetClickedObjectId();
|
||||
g_unk0x100f31b4 = m_event.GetClickedAtom();
|
||||
FUN_100292e0();
|
||||
m_unk0x08 = 1;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10029750
|
||||
MxBool LegoControlManager::FUN_10029750()
|
||||
{
|
||||
MxPresenterListCursor cursor(m_presenterList);
|
||||
MxPresenter* presenter;
|
||||
|
||||
while (cursor.Next(presenter)) {
|
||||
if (presenter->GetAction() && presenter->GetAction()->GetObjectId() == g_unk0x100f31b0 &&
|
||||
presenter->GetAction()->GetAtomId().GetInternal() == g_unk0x100f31b4) {
|
||||
if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) {
|
||||
FUN_100292e0();
|
||||
}
|
||||
|
||||
g_unk0x100f31b0 = -1;
|
||||
g_unk0x100f31b4 = NULL;
|
||||
|
||||
m_unk0x08 = 0;
|
||||
m_unk0x0c = 0;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
g_unk0x100f31b0 = -1;
|
||||
g_unk0x100f31b4 = NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user