mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-11-26 17:36:12 -05:00
implement LegoWorldPresenter::StartAction (#371)
This commit is contained in:
parent
ac6eb28dc4
commit
5a1ba02772
1 changed files with 56 additions and 2 deletions
|
@ -2,6 +2,14 @@
|
||||||
|
|
||||||
#include "legoentity.h"
|
#include "legoentity.h"
|
||||||
#include "legoomni.h"
|
#include "legoomni.h"
|
||||||
|
#include "legovideomanager.h"
|
||||||
|
#include "mxactionnotificationparam.h"
|
||||||
|
#include "mxautolocker.h"
|
||||||
|
#include "mxdsactionlist.h"
|
||||||
|
#include "mxdsmultiaction.h"
|
||||||
|
#include "mxobjectfactory.h"
|
||||||
|
#include "mxpresenter.h"
|
||||||
|
#include "mxstl/stlcompat.h"
|
||||||
|
|
||||||
// GLOBAL: LEGO1 0x100f75d4
|
// GLOBAL: LEGO1 0x100f75d4
|
||||||
undefined4 g_legoWorldPresenterQuality = 1;
|
undefined4 g_legoWorldPresenterQuality = 1;
|
||||||
|
@ -24,10 +32,56 @@ LegoWorldPresenter::~LegoWorldPresenter()
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10066870
|
// FUNCTION: LEGO1 0x10066870
|
||||||
MxResult LegoWorldPresenter::StartAction(MxStreamController* p_controller, MxDSAction* p_action)
|
MxResult LegoWorldPresenter::StartAction(MxStreamController* p_controller, MxDSAction* p_action)
|
||||||
{
|
{
|
||||||
return FAILURE;
|
MxAutoLocker lock(&m_criticalSection);
|
||||||
|
|
||||||
|
MxResult result = FAILURE;
|
||||||
|
MxDSActionList* actions = ((MxDSMultiAction*) p_action)->GetActionList();
|
||||||
|
MxObjectFactory* factory = ObjectFactory();
|
||||||
|
MxDSActionListCursor cursor(actions);
|
||||||
|
MxDSAction* action;
|
||||||
|
|
||||||
|
if (MxPresenter::StartAction(p_controller, p_action) == SUCCESS) {
|
||||||
|
// 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.
|
||||||
|
// The alpha debug build also uses Next().
|
||||||
|
cursor.Head();
|
||||||
|
while (cursor.Current(action)) {
|
||||||
|
cursor.NextFragment();
|
||||||
|
|
||||||
|
MxBool success = FALSE;
|
||||||
|
|
||||||
|
action->CopyFlags(m_action->GetFlags());
|
||||||
|
|
||||||
|
const char* presenterName = PresenterNameDispatch(*action);
|
||||||
|
MxPresenter* presenter = (MxPresenter*) factory->Create(presenterName);
|
||||||
|
|
||||||
|
if (presenter && presenter->AddToManager() == SUCCESS) {
|
||||||
|
presenter->SetCompositePresenter(this);
|
||||||
|
if (presenter->StartAction(p_controller, action) == SUCCESS) {
|
||||||
|
presenter->SetTickleState(TickleState_Idle);
|
||||||
|
success = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
action->SetOrigin(this);
|
||||||
|
m_list.push_back(presenter);
|
||||||
|
}
|
||||||
|
else if (presenter)
|
||||||
|
delete presenter;
|
||||||
|
}
|
||||||
|
|
||||||
|
VideoManager()->AddPresenter(*this);
|
||||||
|
|
||||||
|
result = SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10066a50
|
// FUNCTION: LEGO1 0x10066a50
|
||||||
|
|
Loading…
Reference in a new issue