mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-11-22 15:37:55 -05:00
lego1: implement MxTimer + dependencies
This commit is contained in:
parent
0827ca8040
commit
a925aec046
16 changed files with 296 additions and 9 deletions
14
LEGO1/mxautolocker.cpp
Normal file
14
LEGO1/mxautolocker.cpp
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#include "mxautolocker.h"
|
||||||
|
|
||||||
|
MxAutoLocker::MxAutoLocker(MxCriticalSection *critsect)
|
||||||
|
{
|
||||||
|
this->m_criticalSection = critsect;
|
||||||
|
if (this->m_criticalSection != 0)
|
||||||
|
this->m_criticalSection->Enter();
|
||||||
|
}
|
||||||
|
|
||||||
|
MxAutoLocker::~MxAutoLocker()
|
||||||
|
{
|
||||||
|
if (this->m_criticalSection != 0)
|
||||||
|
this->m_criticalSection->Leave();
|
||||||
|
}
|
15
LEGO1/mxautolocker.h
Normal file
15
LEGO1/mxautolocker.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef MXAUTOLOCKER_H
|
||||||
|
#define MXAUTOLOCKER_H
|
||||||
|
|
||||||
|
#include "mxcriticalsection.h"
|
||||||
|
|
||||||
|
class MxAutoLocker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MxAutoLocker(MxCriticalSection* cs);
|
||||||
|
virtual ~MxAutoLocker();
|
||||||
|
private:
|
||||||
|
MxCriticalSection* m_criticalSection;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MXAUTOLOCKER_H
|
|
@ -3,4 +3,7 @@
|
||||||
|
|
||||||
typedef unsigned char MxBool;
|
typedef unsigned char MxBool;
|
||||||
|
|
||||||
|
#define MX_TRUE 1
|
||||||
|
#define MX_FALSE 0
|
||||||
|
|
||||||
#endif // MXBOOL_H
|
#endif // MXBOOL_H
|
||||||
|
|
15
LEGO1/mxomni.cpp
Normal file
15
LEGO1/mxomni.cpp
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#include "mxomni.h"
|
||||||
|
|
||||||
|
MxResult MxOmni::Create(const MxOmniCreateParam &p)
|
||||||
|
{
|
||||||
|
if (p.CreateFlags().CreateTimer())
|
||||||
|
{
|
||||||
|
MxTimer *timer = new MxTimer();
|
||||||
|
this->m_Timer = timer;
|
||||||
|
|
||||||
|
if (timer == NULL)
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
|
@ -1,6 +1,11 @@
|
||||||
#ifndef MXOMNI_H
|
#ifndef MXOMNI_H
|
||||||
#define MXOMNI_H
|
#define MXOMNI_H
|
||||||
|
|
||||||
|
#include "mxresult.h"
|
||||||
|
#include "mxomnicreateparam.h"
|
||||||
|
#include "mxomnicreateflags.h"
|
||||||
|
#include "mxtimer.h"
|
||||||
|
|
||||||
class MxOmni
|
class MxOmni
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -12,6 +17,14 @@ class MxOmni
|
||||||
__declspec(dllexport) static void SetCD(const char *s);
|
__declspec(dllexport) static void SetCD(const char *s);
|
||||||
__declspec(dllexport) static void SetHD(const char *s);
|
__declspec(dllexport) static void SetHD(const char *s);
|
||||||
__declspec(dllexport) static void SetSound3D(unsigned char);
|
__declspec(dllexport) static void SetSound3D(unsigned char);
|
||||||
|
|
||||||
|
MxResult MxOmni::Create(const MxOmniCreateParam &p);
|
||||||
|
|
||||||
|
MxTimer* GetTimer() const { return this->m_Timer; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
char padding[0x3c];
|
||||||
|
MxTimer* m_Timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MXOMNI_H
|
#endif // MXOMNI_H
|
||||||
|
|
16
LEGO1/mxomnicreateflags.cpp
Normal file
16
LEGO1/mxomnicreateflags.cpp
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#include "mxomnicreateflags.h"
|
||||||
|
|
||||||
|
MxOmniCreateFlags::MxOmniCreateFlags()
|
||||||
|
{
|
||||||
|
this->CreateObjectFactory(MX_TRUE);
|
||||||
|
this->CreateVariableTable(MX_TRUE);
|
||||||
|
this->CreateTickleManager(MX_TRUE);
|
||||||
|
this->CreateNotificationManager(MX_TRUE);
|
||||||
|
this->CreateVideoManager(MX_TRUE);
|
||||||
|
this->CreateSoundManager(MX_TRUE);
|
||||||
|
this->CreateMusicManager(MX_TRUE);
|
||||||
|
this->CreateEventManager(MX_TRUE);
|
||||||
|
|
||||||
|
this->CreateTimer(MX_TRUE);
|
||||||
|
this->CreateStreamer(MX_TRUE);
|
||||||
|
}
|
|
@ -1,14 +1,56 @@
|
||||||
#ifndef MXOMNICREATEFLAGS_H
|
#ifndef MXOMNICREATEFLAGS_H
|
||||||
#define MXOMNICREATEFLAGS_H
|
#define MXOMNICREATEFLAGS_H
|
||||||
|
|
||||||
|
#include "mxbool.h"
|
||||||
|
|
||||||
class MxOmniCreateFlags
|
class MxOmniCreateFlags
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum LowFlags {
|
||||||
|
Flag_CreateObjectFactory = 0x01,
|
||||||
|
Flag_CreateVariableTable = 0x02,
|
||||||
|
Flag_CreateTickleManager = 0x04,
|
||||||
|
Flag_CreateNotificationManager = 0x08,
|
||||||
|
Flag_CreateVideoManager = 0x10,
|
||||||
|
Flag_CreateSoundManager = 0x20,
|
||||||
|
Flag_CreateMusicManager = 0x40,
|
||||||
|
Flag_CreateEventManager = 0x80
|
||||||
|
};
|
||||||
|
|
||||||
|
enum HighFlags {
|
||||||
|
Flag_CreateTimer = 0x02,
|
||||||
|
Flag_CreateStreamer = 0x04
|
||||||
|
};
|
||||||
|
|
||||||
__declspec(dllexport) MxOmniCreateFlags();
|
__declspec(dllexport) MxOmniCreateFlags();
|
||||||
|
|
||||||
private:
|
const inline MxBool CreateObjectFactory() const { return this->m_flags1 & Flag_CreateObjectFactory; }
|
||||||
unsigned short m_flags;
|
const inline MxBool CreateVariableTable() const { return this->m_flags1 & Flag_CreateVariableTable; }
|
||||||
|
const inline MxBool CreateTickleManager() const { return this->m_flags1 & Flag_CreateTickleManager; }
|
||||||
|
const inline MxBool CreateNotificationManager() const { return this->m_flags1 & Flag_CreateNotificationManager; }
|
||||||
|
const inline MxBool CreateVideoManager() const { return this->m_flags1 & Flag_CreateVideoManager; }
|
||||||
|
const inline MxBool CreateSoundManager() const { return this->m_flags1 & Flag_CreateSoundManager; }
|
||||||
|
const inline MxBool CreateMusicManager() const { return this->m_flags1 & Flag_CreateMusicManager; }
|
||||||
|
const inline MxBool CreateEventManager() const { return this->m_flags1 & Flag_CreateEventManager; }
|
||||||
|
|
||||||
|
const inline MxBool CreateTimer() const { return this->m_flags2 & Flag_CreateTimer; }
|
||||||
|
const inline MxBool CreateStreamer() const { return this->m_flags2 & Flag_CreateStreamer; }
|
||||||
|
|
||||||
|
inline void CreateObjectFactory(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateObjectFactory : this->m_flags1 & ~Flag_CreateObjectFactory); }
|
||||||
|
inline void CreateVariableTable(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateVariableTable : this->m_flags1 & ~Flag_CreateVariableTable); }
|
||||||
|
inline void CreateTickleManager(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateTickleManager : this->m_flags1 & ~Flag_CreateTickleManager); }
|
||||||
|
inline void CreateNotificationManager(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateNotificationManager : this->m_flags1 & ~Flag_CreateNotificationManager); }
|
||||||
|
inline void CreateVideoManager(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateVideoManager : this->m_flags1 & ~Flag_CreateVideoManager); }
|
||||||
|
inline void CreateSoundManager(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateSoundManager : this->m_flags1 & ~Flag_CreateSoundManager); }
|
||||||
|
inline void CreateMusicManager(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateMusicManager : this->m_flags1 & ~Flag_CreateMusicManager); }
|
||||||
|
inline void CreateEventManager(MxBool b) { this->m_flags1 = (b == MX_TRUE ? this->m_flags1 | Flag_CreateEventManager : this->m_flags1 & ~Flag_CreateEventManager); }
|
||||||
|
|
||||||
|
inline void CreateTimer(MxBool b) { this->m_flags2 = (b == MX_TRUE ? this->m_flags2 | Flag_CreateTimer : this->m_flags2 & ~Flag_CreateTimer); }
|
||||||
|
inline void CreateStreamer(MxBool b) { this->m_flags2 = (b == MX_TRUE ? this->m_flags2 | Flag_CreateStreamer : this->m_flags2 & ~Flag_CreateStreamer); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned char m_flags1;
|
||||||
|
unsigned char m_flags2;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MXOMNICREATEFLAGS_H
|
#endif // MXOMNICREATEFLAGS_H
|
||||||
|
|
9
LEGO1/mxomnicreateparam.cpp
Normal file
9
LEGO1/mxomnicreateparam.cpp
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include "mxomnicreateparam.h"
|
||||||
|
|
||||||
|
MxOmniCreateParam::MxOmniCreateParam(const char *mediaPath, HWND windowHandle, MxVideoParam &vparam, MxOmniCreateFlags flags)
|
||||||
|
{
|
||||||
|
this->m_mediaPath = mediaPath;
|
||||||
|
this->m_windowHandle = windowHandle;
|
||||||
|
this->m_videoParam = vparam;
|
||||||
|
this->m_createFlags = flags;
|
||||||
|
}
|
|
@ -11,15 +11,16 @@
|
||||||
class MxOmniCreateParam : public MxOmniCreateParamBase
|
class MxOmniCreateParam : public MxOmniCreateParamBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
__declspec(dllexport) MxOmniCreateParam(const char *mediaPath, struct HWND__ *windowHandle, MxVideoParam &vparam, MxOmniCreateFlags flags);
|
__declspec(dllexport) MxOmniCreateParam(const char *mediaPath, HWND windowHandle, MxVideoParam &vparam, MxOmniCreateFlags flags);
|
||||||
virtual void vtable00();
|
// virtual void vtable00(); seems to be a destructor
|
||||||
|
|
||||||
|
const MxOmniCreateFlags& CreateFlags() const { return this->m_createFlags; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MxString m_mediaPath;
|
MxString m_mediaPath;
|
||||||
HWND m_windowHandle;
|
HWND m_windowHandle;
|
||||||
MxVideoParam m_videoParam;
|
MxVideoParam m_videoParam;
|
||||||
MxOmniCreateFlags m_createFlags;
|
MxOmniCreateFlags m_createFlags;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MXOMNICREATEPARAM_H
|
#endif // MXOMNICREATEPARAM_H
|
||||||
|
|
30
LEGO1/mxstring.cpp
Normal file
30
LEGO1/mxstring.cpp
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#include "mxstring.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
MxString::MxString()
|
||||||
|
{
|
||||||
|
// Set string to one char in length and set that char to null terminator
|
||||||
|
this->m_data = (char *)malloc(1);
|
||||||
|
this->m_data[0] = 0;
|
||||||
|
this->m_length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this *mostly* matches, again weird with the comparison
|
||||||
|
const MxString &MxString::operator=(const char *param)
|
||||||
|
{
|
||||||
|
if (this->m_data != param)
|
||||||
|
{
|
||||||
|
free(this->m_data);
|
||||||
|
this->m_length = strlen(param);
|
||||||
|
this->m_data = (char *)malloc(this->m_length + 1);
|
||||||
|
strcpy(this->m_data, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
MxString::~MxString()
|
||||||
|
{
|
||||||
|
free(this->m_data);
|
||||||
|
}
|
|
@ -10,6 +10,8 @@ class MxString : public MxCore
|
||||||
__declspec(dllexport) virtual ~MxString();
|
__declspec(dllexport) virtual ~MxString();
|
||||||
__declspec(dllexport) const MxString &operator=(const char *);
|
__declspec(dllexport) const MxString &operator=(const char *);
|
||||||
|
|
||||||
|
MxString();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char *m_data;
|
char *m_data;
|
||||||
unsigned short m_length;
|
unsigned short m_length;
|
||||||
|
|
34
LEGO1/mxtimer.cpp
Normal file
34
LEGO1/mxtimer.cpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#include "mxtimer.h"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
long MxTimer::s_LastTimeCalculated = 0;
|
||||||
|
long MxTimer::s_LastTimeTimerStarted = 0;
|
||||||
|
|
||||||
|
MxTimer::MxTimer()
|
||||||
|
{
|
||||||
|
this->m_isRunning = FALSE;
|
||||||
|
MxTimer::s_LastTimeCalculated = timeGetTime();
|
||||||
|
this->m_startTime = MxTimer::s_LastTimeCalculated;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MxTimer::Start()
|
||||||
|
{
|
||||||
|
this->m_isRunning = TRUE;
|
||||||
|
MxTimer::s_LastTimeTimerStarted = timeGetTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MxTimer::Stop()
|
||||||
|
{
|
||||||
|
long elapsed = this->GetRealTime();
|
||||||
|
long startTime = elapsed - MxTimer::s_LastTimeTimerStarted;
|
||||||
|
this->m_isRunning = FALSE;
|
||||||
|
// this feels very stupid but it's what the assembly does
|
||||||
|
this->m_startTime = this->m_startTime + startTime - 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
long MxTimer::GetRealTime()
|
||||||
|
{
|
||||||
|
MxTimer::s_LastTimeCalculated = timeGetTime();
|
||||||
|
return MxTimer::s_LastTimeCalculated - this->m_startTime;
|
||||||
|
}
|
|
@ -1,10 +1,31 @@
|
||||||
#ifndef MXTIMER_H
|
#ifndef MXTIMER_H
|
||||||
#define MXTIMER_H
|
#define MXTIMER_H
|
||||||
|
|
||||||
class MxTimer
|
#include "mxcore.h"
|
||||||
|
|
||||||
|
class MxTimer : public MxCore
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
MxTimer();
|
||||||
|
|
||||||
|
void Start();
|
||||||
|
void Stop();
|
||||||
|
|
||||||
__declspec(dllexport) long GetRealTime();
|
__declspec(dllexport) long GetRealTime();
|
||||||
|
|
||||||
|
long GetTime() inline
|
||||||
|
{
|
||||||
|
if (this->m_isRunning)
|
||||||
|
return s_LastTimeCalculated;
|
||||||
|
else
|
||||||
|
return s_LastTimeCalculated - this->m_startTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
long m_startTime;
|
||||||
|
MxBool m_isRunning;
|
||||||
|
static long s_LastTimeCalculated;
|
||||||
|
static long s_LastTimeTimerStarted;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MXTIMER_H
|
#endif // MXTIMER_H
|
||||||
|
|
54
LEGO1/mxvideoparam.cpp
Normal file
54
LEGO1/mxvideoparam.cpp
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#include "mxvideoparam.h"
|
||||||
|
|
||||||
|
MxVideoParam::MxVideoParam()
|
||||||
|
{
|
||||||
|
this->m_flags = MxVideoParamFlags();
|
||||||
|
this->m_right = 640;
|
||||||
|
this->m_bottom = 480;
|
||||||
|
this->m_left = 0;
|
||||||
|
this->m_top = 0;
|
||||||
|
this->m_palette = 0;
|
||||||
|
this->m_backBuffers = 0;
|
||||||
|
this->m_unk1c = 0;
|
||||||
|
this->m_deviceId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MxVideoParam &MxVideoParam::operator=(const MxVideoParam &other)
|
||||||
|
{
|
||||||
|
m_flags = MxVideoParamFlags();
|
||||||
|
m_left = other.m_left;
|
||||||
|
m_top = other.m_top;
|
||||||
|
m_right = other.m_right;
|
||||||
|
m_bottom = other.m_bottom;
|
||||||
|
m_palette = other.m_palette;
|
||||||
|
m_backBuffers = other.m_backBuffers;
|
||||||
|
m_flags = other.m_flags;
|
||||||
|
m_unk1c = other.m_unk1c;
|
||||||
|
m_deviceId = other.m_deviceId;
|
||||||
|
SetDeviceName(other.m_deviceId);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this doesn't match exactly, something weird with the conditional on id
|
||||||
|
void MxVideoParam::SetDeviceName(char *id)
|
||||||
|
{
|
||||||
|
if (this->m_deviceId != 0)
|
||||||
|
free(this->m_deviceId);
|
||||||
|
|
||||||
|
if (id == 0)
|
||||||
|
{
|
||||||
|
this->m_deviceId = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->m_deviceId = (char *)malloc(strlen(id) + 1);
|
||||||
|
strcpy(this->m_deviceId, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MxVideoParam::~MxVideoParam()
|
||||||
|
{
|
||||||
|
if (this->m_deviceId != 0)
|
||||||
|
free(this->m_deviceId);
|
||||||
|
}
|
16
LEGO1/mxvideoparamflags.cpp
Normal file
16
LEGO1/mxvideoparamflags.cpp
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#include "mxvideoparamflags.h"
|
||||||
|
|
||||||
|
MxVideoParamFlags::MxVideoParamFlags()
|
||||||
|
{
|
||||||
|
// TODO: convert to EnableXXX function calls
|
||||||
|
unsigned char bVar1 = this->m_flags1;
|
||||||
|
this->m_flags1 = bVar1 & 0xfe;
|
||||||
|
this->m_flags1 = bVar1 & 0xfc;
|
||||||
|
this->m_flags1 = bVar1 & 0xf8;
|
||||||
|
this->m_flags1 = bVar1 & 0xf0;
|
||||||
|
this->m_flags1 = bVar1 & 0xe0;
|
||||||
|
this->m_flags2 = this->m_flags2 | 2;
|
||||||
|
this->m_flags1 = bVar1 & 0xc0;
|
||||||
|
this->m_flags1 = bVar1 & 0xc0 | 0x40;
|
||||||
|
this->m_flags1 = 0xc0;
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef MXVIDEOPARAMFLAGS_H
|
#ifndef MXVIDEOPARAMFLAGS_H
|
||||||
#define MXVIDEOPARAMFLAGS_H
|
#define MXVIDEOPARAMFLAGS_H
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
class MxVideoParamFlags
|
class MxVideoParamFlags
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue