mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-23 16:34:06 +00:00
137 lines
2.5 KiB
C++
137 lines
2.5 KiB
C++
#include "legopathpresenter.h"
|
|
|
|
#include "define.h"
|
|
#include "legopathcontroller.h"
|
|
#include "legovideomanager.h"
|
|
#include "legoworld.h"
|
|
#include "misc.h"
|
|
#include "mxautolock.h"
|
|
#include "mxdssubscriber.h"
|
|
#include "mxutilities.h"
|
|
|
|
DECOMP_SIZE_ASSERT(LegoPathPresenter, 0x54)
|
|
|
|
// FUNCTION: LEGO1 0x100448d0
|
|
LegoPathPresenter::LegoPathPresenter()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044ab0
|
|
void LegoPathPresenter::Init()
|
|
{
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044ac0
|
|
LegoPathPresenter::~LegoPathPresenter()
|
|
{
|
|
Destroy(TRUE);
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044b40
|
|
MxResult LegoPathPresenter::AddToManager()
|
|
{
|
|
MxResult status = FAILURE;
|
|
|
|
if (VideoManager()) {
|
|
VideoManager()->RegisterPresenter(*this);
|
|
status = SUCCESS;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044b70
|
|
void LegoPathPresenter::Destroy(MxBool p_fromDestructor)
|
|
{
|
|
if (VideoManager()) {
|
|
VideoManager()->UnregisterPresenter(*this);
|
|
}
|
|
|
|
{
|
|
AUTOLOCK(m_criticalSection);
|
|
Init();
|
|
}
|
|
|
|
if (!p_fromDestructor) {
|
|
MxMediaPresenter::Destroy(FALSE);
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044c10
|
|
void LegoPathPresenter::Destroy()
|
|
{
|
|
Destroy(FALSE);
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044c20
|
|
void LegoPathPresenter::ReadyTickle()
|
|
{
|
|
LegoWorld* world = CurrentWorld();
|
|
|
|
if (world) {
|
|
MxStreamChunk* chunk = m_subscriber->PopData();
|
|
|
|
if (chunk) {
|
|
LegoPathController* controller = new LegoPathController();
|
|
|
|
if (controller == NULL) {
|
|
EndAction();
|
|
}
|
|
else {
|
|
ParseExtra();
|
|
|
|
controller->Create(chunk->GetData(), m_action->GetLocation(), m_trigger);
|
|
world->AddPath(controller);
|
|
|
|
m_subscriber->FreeDataChunk(chunk);
|
|
ProgressTickleState(MxPresenter::e_starting);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044d00
|
|
void LegoPathPresenter::StreamingTickle()
|
|
{
|
|
MxStreamChunk* chunk = m_subscriber->PopData();
|
|
|
|
if (chunk) {
|
|
if (chunk->GetChunkFlags() & DS_CHUNK_END_OF_STREAM) {
|
|
ProgressTickleState(e_repeating);
|
|
}
|
|
|
|
m_subscriber->FreeDataChunk(chunk);
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044d40
|
|
void LegoPathPresenter::RepeatingTickle()
|
|
{
|
|
if (this->m_action->GetDuration() == -1) {
|
|
return;
|
|
}
|
|
|
|
EndAction();
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10044d60
|
|
void LegoPathPresenter::ParseExtra()
|
|
{
|
|
MxU16 extraLength;
|
|
char* extraData;
|
|
m_action->GetExtra(extraLength, extraData);
|
|
|
|
if (extraLength) {
|
|
char extraCopy[256], output[256];
|
|
memcpy(extraCopy, extraData, extraLength);
|
|
extraCopy[extraLength] = '\0';
|
|
|
|
strupr(extraCopy);
|
|
|
|
if (KeyValueStringParse(output, g_strTRIGGERS_SOURCE, extraCopy) != FALSE) {
|
|
m_trigger = MxAtomId(output, e_lowerCase2);
|
|
}
|
|
}
|
|
}
|