Merge branch 'isledecomp:master' into fix-act3ammo

This commit is contained in:
MS 2025-07-09 10:55:47 -04:00 committed by GitHub
commit 7d334f83cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
229 changed files with 5740 additions and 4381 deletions

View File

@ -172,9 +172,12 @@ jobs:
- name: Aggregate Accuracy - name: Aggregate Accuracy
shell: bash shell: bash
run: | run: |
reccmp-aggregate --samples $(find build-entropy -type f -name "CONFIGPROGRESS*.json") --output CONFIGPROGRESS-agg.json --html CONFIGPROGRESS-agg.html find build-entropy -type f -name "CONFIGPROGRESS*.json" > configsamples.txt
reccmp-aggregate --samples $(find build-entropy -type f -name "ISLEPROGRESS*.json") --output ISLEPROGRESS-agg.json --html ISLEPROGRESS-agg.html find build-entropy -type f -name "ISLEPROGRESS*.json" > islesamples.txt
reccmp-aggregate --samples $(find build-entropy -type f -name "LEGO1PROGRESS*.json") --output LEGO1PROGRESS-agg.json --html LEGO1PROGRESS-agg.html find build-entropy -type f -name "LEGO1PROGRESS*.json" > lego1samples.txt
reccmp-aggregate --samples @configsamples.txt --output CONFIGPROGRESS-agg.json --html CONFIGPROGRESS-agg.html
reccmp-aggregate --samples @islesamples.txt --output ISLEPROGRESS-agg.json --html ISLEPROGRESS-agg.html
reccmp-aggregate --samples @lego1samples.txt --output LEGO1PROGRESS-agg.json --html LEGO1PROGRESS-agg.html
- name: Compare Aggregate Accuracy With Current Master - name: Compare Aggregate Accuracy With Current Master
shell: bash shell: bash

2
.gitignore vendored
View File

@ -27,3 +27,5 @@ tools/ghidra_scripts/import.log
# These entries are kept for now since that convention has not always been around. # These entries are kept for now since that convention has not always been around.
ISLE.EXE ISLE.EXE
LEGO1.DLL LEGO1.DLL
.DS_Store

View File

@ -160,7 +160,7 @@ function(add_lego_libraries NAME)
add_library(geom${ARG_SUFFIX} STATIC add_library(geom${ARG_SUFFIX} STATIC
LEGO1/lego/sources/geom/legoedge.cpp LEGO1/lego/sources/geom/legoedge.cpp
LEGO1/lego/sources/geom/legoweedge.cpp LEGO1/lego/sources/geom/legoweedge.cpp
LEGO1/lego/sources/geom/legounkown100db7f4.cpp LEGO1/lego/sources/geom/legoorientededge.cpp
LEGO1/lego/sources/geom/legowegedge.cpp LEGO1/lego/sources/geom/legowegedge.cpp
) )
list(APPEND list_targets geom${ARG_SUFFIX}) list(APPEND list_targets geom${ARG_SUFFIX})
@ -483,7 +483,12 @@ if(ISLE_BUILD_BETA10)
OUT_TARGETS beta10_targets OUT_TARGETS beta10_targets
) )
reccmp_add_target(beta10 ID BETA10) reccmp_add_target(beta10 ID BETA10)
# Enable `#ifdef BETA10` conditions
target_compile_definitions(beta10 PRIVATE BETA10) target_compile_definitions(beta10 PRIVATE BETA10)
foreach(tgt IN LISTS beta10_targets)
target_compile_definitions(${tgt} PRIVATE BETA10)
endforeach()
endif() endif()
if (ISLE_BUILD_APP) if (ISLE_BUILD_APP)
@ -600,10 +605,13 @@ if (MSVC_FOR_DECOMP)
endif() endif()
endif() endif()
# Setting the MSVC_RUNTIME_LIBRARY for all libraries as well as `lego1` produces the results
# that are most consistent with the LEGO1.DLL and BETA10.DLL originals we have.
# Equivalent to target_compile_options(... PRIVATE "/MT$<$<CONFIG:Debug>:d>")
set_property(TARGET ${lego1_targets} ${beta10_targets} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
if(TARGET lego1) if(TARGET lego1)
target_link_options(lego1 PRIVATE "/OPT:REF") target_link_options(lego1 PRIVATE "/OPT:REF")
# Equivalent to target_compile_options(... PRIVATE "/MT$<$<CONFIG:Debug>:d>") set_property(TARGET lego1 PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET lego1 ${lego1_targets} ${beta10_targets} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif() endif()
set(CMAKE_CXX_FLAGS "/W3 /GX /D \"WIN32\" /D \"_WINDOWS\"") set(CMAKE_CXX_FLAGS "/W3 /GX /D \"WIN32\" /D \"_WINDOWS\"")

View File

@ -15,7 +15,7 @@ CConfigCommandLineInfo::CConfigCommandLineInfo()
void CConfigCommandLineInfo::ParseParam(LPCSTR pszParam, BOOL bFlag, BOOL bLast) void CConfigCommandLineInfo::ParseParam(LPCSTR pszParam, BOOL bFlag, BOOL bLast)
{ {
if (bFlag) { if (bFlag) {
if (lstrcmpiA(pszParam, "config") == 0) { if (lstrcmpi(pszParam, "config") == 0) {
currentConfigApp->m_run_config_dialog = TRUE; currentConfigApp->m_run_config_dialog = TRUE;
} }
} }

View File

@ -13,7 +13,7 @@ DECOMP_SIZE_ASSERT(CMainDialog, 0x70)
CMainDialog::CMainDialog(CWnd* pParent) : CDialog(IDD, pParent) CMainDialog::CMainDialog(CWnd* pParent) : CDialog(IDD, pParent)
{ {
afxCurrentWinApp; afxCurrentWinApp;
m_icon = LoadIconA(AfxFindResourceHandle(MAKEINTRESOURCE(IDI_CONFIG), RT_GROUP_ICON), MAKEINTRESOURCE(IDI_CONFIG)); m_icon = LoadIcon(AfxFindResourceHandle(MAKEINTRESOURCE(IDI_CONFIG), RT_GROUP_ICON), MAKEINTRESOURCE(IDI_CONFIG));
} }
// FUNCTION: CONFIG 0x00403e50 // FUNCTION: CONFIG 0x00403e50
@ -52,8 +52,8 @@ BOOL CMainDialog::OnInitDialog()
CString about_text; CString about_text;
about_text.LoadString(IDS_ABOUT); about_text.LoadString(IDS_ABOUT);
if (system_menu) { if (system_menu) {
AppendMenuA(system_menu->m_hMenu, MF_SEPARATOR, 0, NULL); AppendMenu(system_menu->m_hMenu, MF_SEPARATOR, 0, NULL);
AppendMenuA(system_menu->m_hMenu, MF_STRING, 16, (LPCTSTR) about_text); AppendMenu(system_menu->m_hMenu, MF_STRING, 16, (LPCTSTR) about_text);
} }
SendMessage(WM_SETICON, ICON_BIG, (LPARAM) m_icon); SendMessage(WM_SETICON, ICON_BIG, (LPARAM) m_icon);
SendMessage(WM_SETICON, ICON_SMALL, (LPARAM) m_icon); SendMessage(WM_SETICON, ICON_SMALL, (LPARAM) m_icon);

View File

@ -106,7 +106,7 @@ BOOL CConfigApp::InitInstance()
// FUNCTION: CONFIG 0x00403100 // FUNCTION: CONFIG 0x00403100
BOOL CConfigApp::IsLegoNotRunning() BOOL CConfigApp::IsLegoNotRunning()
{ {
HWND hWnd = FindWindowA("Lego Island MainNoM App", "LEGO\xae"); HWND hWnd = FindWindow("Lego Island MainNoM App", "LEGO\xae");
if (_stricmp(afxCurrentAppName, "config") == 0 || !hWnd) { if (_stricmp(afxCurrentAppName, "config") == 0 || !hWnd) {
return TRUE; return TRUE;
} }
@ -122,7 +122,7 @@ BOOL CConfigApp::WriteReg(const char* p_key, const char* p_value) const
HKEY hKey; HKEY hKey;
DWORD pos; DWORD pos;
if (RegCreateKeyExA( if (RegCreateKeyEx(
HKEY_LOCAL_MACHINE, HKEY_LOCAL_MACHINE,
"SOFTWARE\\Mindscape\\LEGO Island", "SOFTWARE\\Mindscape\\LEGO Island",
0, 0,
@ -133,7 +133,7 @@ BOOL CConfigApp::WriteReg(const char* p_key, const char* p_value) const
&hKey, &hKey,
&pos &pos
) == ERROR_SUCCESS) { ) == ERROR_SUCCESS) {
if (RegSetValueExA(hKey, p_key, 0, REG_SZ, (LPBYTE) p_value, strlen(p_value)) == ERROR_SUCCESS) { if (RegSetValueEx(hKey, p_key, 0, REG_SZ, (LPBYTE) p_value, strlen(p_value)) == ERROR_SUCCESS) {
if (RegCloseKey(hKey) == ERROR_SUCCESS) { if (RegCloseKey(hKey) == ERROR_SUCCESS) {
return TRUE; return TRUE;
} }
@ -153,8 +153,8 @@ BOOL CConfigApp::ReadReg(LPCSTR p_key, LPCSTR p_value, DWORD p_size) const
BOOL out = FALSE; BOOL out = FALSE;
DWORD size = p_size; DWORD size = p_size;
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Mindscape\\LEGO Island", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Mindscape\\LEGO Island", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
if (RegQueryValueExA(hKey, p_key, NULL, &valueType, (LPBYTE) p_value, &size) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, p_key, NULL, &valueType, (LPBYTE) p_value, &size) == ERROR_SUCCESS) {
if (RegCloseKey(hKey) == ERROR_SUCCESS) { if (RegCloseKey(hKey) == ERROR_SUCCESS) {
out = TRUE; out = TRUE;
} }
@ -236,7 +236,7 @@ BOOL CConfigApp::ReadRegisterSettings()
if (tmp != 0) { if (tmp != 0) {
is_modified = TRUE; is_modified = TRUE;
m_device_enumerator->FUN_1009d210(); m_device_enumerator->FUN_1009d210();
tmp = m_device_enumerator->FUN_1009d0d0(); tmp = m_device_enumerator->GetBestDevice();
m_device_enumerator->GetDevice(tmp, m_driver, m_device); m_device_enumerator->GetDevice(tmp, m_driver, m_device);
} }
if (!ReadRegInt("Display Bit Depth", &m_display_bit_depth)) { if (!ReadRegInt("Display Bit Depth", &m_display_bit_depth)) {
@ -349,17 +349,17 @@ DWORD CConfigApp::GetConditionalDeviceRenderBitDepth() const
if (GetHardwareDeviceColorModel()) { if (GetHardwareDeviceColorModel()) {
return 0; return 0;
} }
return m_device->m_HELDesc.dwDeviceRenderBitDepth & 0x800; return m_device->m_HELDesc.dwDeviceRenderBitDepth & DDBD_8;
} }
// FUNCTION: CONFIG 0x004037e0 // FUNCTION: CONFIG 0x004037e0
DWORD CConfigApp::GetDeviceRenderBitStatus() const DWORD CConfigApp::GetDeviceRenderBitStatus() const
{ {
if (GetHardwareDeviceColorModel()) { if (GetHardwareDeviceColorModel()) {
return m_device->m_HWDesc.dwDeviceRenderBitDepth & 0x400; return m_device->m_HWDesc.dwDeviceRenderBitDepth & DDBD_16;
} }
else { else {
return m_device->m_HELDesc.dwDeviceRenderBitDepth & 0x400; return m_device->m_HELDesc.dwDeviceRenderBitDepth & DDBD_16;
} }
} }

View File

@ -42,7 +42,7 @@ class CConfigApp : public CWinApp {
DWORD GetConditionalDeviceRenderBitDepth() const; DWORD GetConditionalDeviceRenderBitDepth() const;
DWORD GetDeviceRenderBitStatus() const; DWORD GetDeviceRenderBitStatus() const;
BOOL AdjustDisplayBitDepthBasedOnRenderStatus(); BOOL AdjustDisplayBitDepthBasedOnRenderStatus();
void CConfigApp::WriteRegisterSettings() const; void WriteRegisterSettings() const;
//{{AFX_MSG(CConfigApp) //{{AFX_MSG(CConfigApp)
// NOTE - the ClassWizard will add and remove member functions here. // NOTE - the ClassWizard will add and remove member functions here.

View File

@ -22,7 +22,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
OSVERSIONINFOA os_version; OSVERSIONINFOA os_version;
os_version.dwOSVersionInfoSize = sizeof(os_version); os_version.dwOSVersionInfoSize = sizeof(os_version);
if (!GetVersionExA(&os_version)) { if (!GetVersionEx(&os_version)) {
*p_version = 0; *p_version = 0;
*p_found = 0; *p_found = 0;
return; return;
@ -38,16 +38,16 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
return; return;
} }
*p_version = 0x200; *p_version = 0x200;
HMODULE dinput_module = LoadLibraryA("DINPUT.DLL"); HMODULE dinput_module = LoadLibrary("DINPUT.DLL");
if (!dinput_module) { if (!dinput_module) {
OutputDebugStringA("Couldn't LoadLibrary DInput\r\n"); OutputDebugString("Couldn't LoadLibrary DInput\r\n");
return; return;
} }
DirectInputCreateA_fn* func_DirectInputCreateA = DirectInputCreateA_fn* func_DirectInputCreateA =
(DirectInputCreateA_fn*) GetProcAddress(dinput_module, "DirectInputCreateA"); (DirectInputCreateA_fn*) GetProcAddress(dinput_module, "DirectInputCreateA");
FreeLibrary(dinput_module); FreeLibrary(dinput_module);
if (!func_DirectInputCreateA) { if (!func_DirectInputCreateA) {
OutputDebugStringA("Couldn't GetProcAddress DInputCreate\r\n"); OutputDebugString("Couldn't GetProcAddress DInputCreate\r\n");
return; return;
} }
*p_version = 0x300; *p_version = 0x300;
@ -58,7 +58,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
*p_version = 0x501; *p_version = 0x501;
return; return;
} }
HMODULE ddraw_module = LoadLibraryA("DDRAW.DLL"); HMODULE ddraw_module = LoadLibrary("DDRAW.DLL");
if (!ddraw_module) { if (!ddraw_module) {
*p_version = 0; *p_version = 0;
*p_found = 0; *p_found = 0;
@ -71,7 +71,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
*p_version = 0; *p_version = 0;
*p_found = 0; *p_found = 0;
FreeLibrary(ddraw_module); FreeLibrary(ddraw_module);
OutputDebugStringA("Couldn't LoadLibrary DDraw\r\n"); OutputDebugString("Couldn't LoadLibrary DDraw\r\n");
return; return;
} }
LPDIRECTDRAW ddraw; LPDIRECTDRAW ddraw;
@ -79,7 +79,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
*p_version = 0; *p_version = 0;
*p_found = 0; *p_found = 0;
FreeLibrary(ddraw_module); FreeLibrary(ddraw_module);
OutputDebugStringA("Couldn't create DDraw\r\n"); OutputDebugString("Couldn't create DDraw\r\n");
return; return;
} }
*p_version = 0x100; *p_version = 0x100;
@ -87,14 +87,14 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
if (FAILED(ddraw->QueryInterface(IID_IDirectDraw2, (LPVOID*) &ddraw2))) { if (FAILED(ddraw->QueryInterface(IID_IDirectDraw2, (LPVOID*) &ddraw2))) {
ddraw->Release(); ddraw->Release();
FreeLibrary(ddraw_module); FreeLibrary(ddraw_module);
OutputDebugStringA("Couldn't QI DDraw2\r\n"); OutputDebugString("Couldn't QI DDraw2\r\n");
return; return;
} }
ddraw->Release(); ddraw->Release();
*p_version = 0x200; *p_version = 0x200;
HMODULE dinput_module = LoadLibraryA("DINPUT.DLL"); HMODULE dinput_module = LoadLibrary("DINPUT.DLL");
if (!dinput_module) { if (!dinput_module) {
OutputDebugStringA("Couldn't LoadLibrary DInput\r\n"); OutputDebugString("Couldn't LoadLibrary DInput\r\n");
ddraw2->Release(); ddraw2->Release();
FreeLibrary(ddraw_module); FreeLibrary(ddraw_module);
return; return;
@ -105,7 +105,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
if (!func_DirectInputCreateA) { if (!func_DirectInputCreateA) {
FreeLibrary(ddraw_module); FreeLibrary(ddraw_module);
ddraw2->Release(); ddraw2->Release();
OutputDebugStringA("Couldn't GetProcAddress DInputCreate\r\n"); OutputDebugString("Couldn't GetProcAddress DInputCreate\r\n");
return; return;
} }
*p_version = 0x300; *p_version = 0x300;
@ -113,12 +113,12 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
memset(&surface_desc, 0, sizeof(surface_desc)); memset(&surface_desc, 0, sizeof(surface_desc));
surface_desc.dwSize = sizeof(surface_desc); surface_desc.dwSize = sizeof(surface_desc);
surface_desc.dwFlags = DDSD_CAPS; surface_desc.dwFlags = DDSD_CAPS;
surface_desc.ddsCaps.dwCaps = DDCAPS2_NONLOCALVIDMEM; surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if (FAILED(ddraw2->SetCooperativeLevel(NULL, DISCL_BACKGROUND))) { if (FAILED(ddraw2->SetCooperativeLevel(NULL, DDSCL_NORMAL))) {
ddraw2->Release(); ddraw2->Release();
FreeLibrary(ddraw_module); FreeLibrary(ddraw_module);
*p_version = 0; *p_version = 0;
OutputDebugStringA("Couldn't Set coop level\r\n"); OutputDebugString("Couldn't Set coop level\r\n");
return; return;
} }
LPDIRECTDRAWSURFACE surface; LPDIRECTDRAWSURFACE surface;
@ -126,7 +126,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found)
ddraw2->Release(); ddraw2->Release();
FreeLibrary(ddraw_module); FreeLibrary(ddraw_module);
*p_version = 0; *p_version = 0;
OutputDebugStringA("Couldn't CreateSurface\r\n"); OutputDebugString("Couldn't CreateSurface\r\n");
return; return;
} }
LPDIRECTDRAWSURFACE3 surface3; LPDIRECTDRAWSURFACE3 surface3;

View File

@ -15,8 +15,6 @@ To access the Ghidra repository, use the following details:
- Address: `server.mattkc.com` - Address: `server.mattkc.com`
- Port: `13100` - Port: `13100`
**Please note that at the time of writing, much of the information found on the Ghidra server is severely outdated**. Generally, the source code found in this repository represents the latest "source of truth" and should be referenced whenever possible.
## General Guidelines ## General Guidelines
If you feel fit to contribute, feel free to create a pull request! Someone will review and merge it (or provide feedback) as soon as possible. If you feel fit to contribute, feel free to create a pull request! Someone will review and merge it (or provide feedback) as soon as possible.

View File

@ -87,7 +87,7 @@ IsleApp::IsleApp()
m_backBuffersInVram = TRUE; m_backBuffersInVram = TRUE;
m_using8bit = FALSE; m_using8bit = FALSE;
m_using16bit = TRUE; m_using16bit = TRUE;
m_unk0x24 = 0; m_hasLightSupport = FALSE;
m_drawCursor = FALSE; m_drawCursor = FALSE;
m_use3dSound = TRUE; m_use3dSound = TRUE;
m_useMusic = TRUE; m_useMusic = TRUE;
@ -179,7 +179,7 @@ BOOL IsleApp::SetupLegoOmni()
{ {
BOOL result = FALSE; BOOL result = FALSE;
char mediaPath[256]; char mediaPath[256];
GetProfileStringA("LEGO Island", "MediaPath", "", mediaPath, sizeof(mediaPath)); GetProfileString("LEGO Island", "MediaPath", "", mediaPath, sizeof(mediaPath));
#ifdef COMPAT_MODE #ifdef COMPAT_MODE
BOOL failure; BOOL failure;
@ -209,7 +209,7 @@ void IsleApp::SetupVideoFlags(
BOOL backBuffers, BOOL backBuffers,
BOOL using8bit, BOOL using8bit,
BOOL using16bit, BOOL using16bit,
BOOL param_6, BOOL hasLightSupport,
BOOL param_7, BOOL param_7,
BOOL wideViewAngle, BOOL wideViewAngle,
char* deviceId char* deviceId
@ -218,7 +218,7 @@ void IsleApp::SetupVideoFlags(
m_videoParam.Flags().SetFullScreen(fullScreen); m_videoParam.Flags().SetFullScreen(fullScreen);
m_videoParam.Flags().SetFlipSurfaces(flipSurfaces); m_videoParam.Flags().SetFlipSurfaces(flipSurfaces);
m_videoParam.Flags().SetBackBuffers(!backBuffers); m_videoParam.Flags().SetBackBuffers(!backBuffers);
m_videoParam.Flags().SetF2bit0(!param_6); m_videoParam.Flags().SetLacksLightSupport(!hasLightSupport);
m_videoParam.Flags().SetF1bit7(param_7); m_videoParam.Flags().SetF1bit7(param_7);
m_videoParam.Flags().SetWideViewAngle(wideViewAngle); m_videoParam.Flags().SetWideViewAngle(wideViewAngle);
m_videoParam.Flags().SetF2bit1(1); m_videoParam.Flags().SetF2bit1(1);
@ -251,7 +251,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
// Throw error if sound unavailable // Throw error if sound unavailable
if (!soundReady) { if (!soundReady) {
MessageBoxA( MessageBox(
NULL, NULL,
"\"LEGO\xAE Island\" is not detecting a DirectSound compatible sound card. Please quit all other " "\"LEGO\xAE Island\" is not detecting a DirectSound compatible sound card. Please quit all other "
"applications and try again.", "applications and try again.",
@ -266,7 +266,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
// Create window // Create window
if (g_isle->SetupWindow(hInstance, lpCmdLine) != SUCCESS) { if (g_isle->SetupWindow(hInstance, lpCmdLine) != SUCCESS) {
MessageBoxA( MessageBox(
NULL, NULL,
"\"LEGO\xAE Island\" failed to start. Please quit all other applications and try again.", "\"LEGO\xAE Island\" failed to start. Please quit all other applications and try again.",
"LEGO\xAE Island Error", "LEGO\xAE Island Error",
@ -287,12 +287,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
// sample for MSVC600. It's quite possible Mindscape derived this app from that example since they no longer had the // sample for MSVC600. It's quite possible Mindscape derived this app from that example since they no longer had the
// luxury of the MFC AppWizard which we know they used for the frontend used during development (ISLEMFC.EXE, // luxury of the MFC AppWizard which we know they used for the frontend used during development (ISLEMFC.EXE,
// MAIN.EXE, et al.) // MAIN.EXE, et al.)
LoadAcceleratorsA(hInstance, "AppAccel"); LoadAccelerators(hInstance, "AppAccel");
MSG msg; MSG msg;
while (!g_closed) { while (!g_closed) {
while (!PeekMessageA(&msg, NULL, 0, 0, PM_NOREMOVE)) { while (!PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
if (g_isle) { if (g_isle) {
g_isle->Tick(1); g_isle->Tick(1);
} }
@ -303,15 +303,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
} }
while (!g_closed) { while (!g_closed) {
if (!PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) { if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
break; break;
} }
MSG nextMsg; MSG nextMsg;
if (!g_isle || !g_isle->GetWindowHandle() || msg.message != WM_MOUSEMOVE || if (!g_isle || !g_isle->GetWindowHandle() || msg.message != WM_MOUSEMOVE ||
!PeekMessageA(&nextMsg, NULL, 0, 0, PM_NOREMOVE) || nextMsg.message != WM_MOUSEMOVE) { !PeekMessage(&nextMsg, NULL, 0, 0, PM_NOREMOVE) || nextMsg.message != WM_MOUSEMOVE) {
TranslateMessage(&msg); TranslateMessage(&msg);
DispatchMessageA(&msg); DispatchMessage(&msg);
} }
if (g_reqEnableRMDevice) { if (g_reqEnableRMDevice) {
@ -343,7 +343,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
// FUNCTION: ISLE 0x401ca0 // FUNCTION: ISLE 0x401ca0
BOOL FindExistingInstance() BOOL FindExistingInstance()
{ {
HWND hWnd = FindWindowA(WNDCLASS_NAME, WINDOW_TITLE); HWND hWnd = FindWindow(WNDCLASS_NAME, WINDOW_TITLE);
if (hWnd) { if (hWnd) {
if (SetForegroundWindow(hWnd)) { if (SetForegroundWindow(hWnd)) {
ShowWindow(hWnd, SW_RESTORE); ShowWindow(hWnd, SW_RESTORE);
@ -373,14 +373,14 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
unsigned char keyCode = 0; unsigned char keyCode = 0;
if (!g_isle) { if (!g_isle) {
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
} }
switch (uMsg) { switch (uMsg) {
case WM_PAINT: case WM_PAINT:
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_ACTIVATE: case WM_ACTIVATE:
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_ACTIVATEAPP: case WM_ACTIVATEAPP:
if (g_isle) { if (g_isle) {
if ((wParam != 0) && (g_isle->GetFullScreen())) { if ((wParam != 0) && (g_isle->GetFullScreen())) {
@ -395,7 +395,7 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
g_isle->SetWindowActive(wParam); g_isle->SetWindowActive(wParam);
} }
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_CLOSE: case WM_CLOSE:
if (!g_closed && g_isle) { if (!g_closed && g_isle) {
delete g_isle; delete g_isle;
@ -403,7 +403,7 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
g_closed = TRUE; g_closed = TRUE;
return 0; return 0;
} }
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_GETMINMAXINFO: case WM_GETMINMAXINFO:
((MINMAXINFO*) lParam)->ptMaxTrackSize.x = (g_windowRect.right - g_windowRect.left) + 1; ((MINMAXINFO*) lParam)->ptMaxTrackSize.x = (g_windowRect.right - g_windowRect.left) + 1;
((MINMAXINFO*) lParam)->ptMaxTrackSize.y = (g_windowRect.bottom - g_windowRect.top) + 1; ((MINMAXINFO*) lParam)->ptMaxTrackSize.y = (g_windowRect.bottom - g_windowRect.top) + 1;
@ -411,7 +411,7 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
((MINMAXINFO*) lParam)->ptMinTrackSize.y = (g_windowRect.bottom - g_windowRect.top) + 1; ((MINMAXINFO*) lParam)->ptMinTrackSize.y = (g_windowRect.bottom - g_windowRect.top) + 1;
return 0; return 0;
case WM_ENTERMENULOOP: case WM_ENTERMENULOOP:
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_SYSCOMMAND: case WM_SYSCOMMAND:
if (wParam == SC_SCREENSAVE) { if (wParam == SC_SCREENSAVE) {
return 0; return 0;
@ -421,27 +421,27 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (g_rmDisabled) { if (g_rmDisabled) {
ShowWindow(g_isle->GetWindowHandle(), SW_RESTORE); ShowWindow(g_isle->GetWindowHandle(), SW_RESTORE);
} }
PostMessageA(g_isle->GetWindowHandle(), WM_CLOSE, 0, 0); PostMessage(g_isle->GetWindowHandle(), WM_CLOSE, 0, 0);
return 0; return 0;
} }
} }
else if (g_isle && g_isle->GetFullScreen() && (wParam == SC_MOVE || wParam == SC_KEYMENU)) { else if (g_isle && g_isle->GetFullScreen() && (wParam == SC_MOVE || wParam == SC_KEYMENU)) {
return 0; return 0;
} }
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_EXITMENULOOP: case WM_EXITMENULOOP:
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_MOVING: case WM_MOVING:
if (g_isle && g_isle->GetFullScreen()) { if (g_isle && g_isle->GetFullScreen()) {
GetWindowRect(hWnd, (LPRECT) lParam); GetWindowRect(hWnd, (LPRECT) lParam);
return 0; return 0;
} }
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_NCPAINT: case WM_NCPAINT:
if (g_isle && g_isle->GetFullScreen()) { if (g_isle && g_isle->GetFullScreen()) {
return 0; return 0;
} }
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_DISPLAYCHANGE: case WM_DISPLAYCHANGE:
if (g_isle && VideoManager() && g_isle->GetFullScreen() && VideoManager()->GetDirect3D()) { if (g_isle && VideoManager() && g_isle->GetFullScreen() && VideoManager()->GetDirect3D()) {
if (VideoManager()->GetDirect3D()->AssignedDevice()) { if (VideoManager()->GetDirect3D()->AssignedDevice()) {
@ -474,12 +474,12 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
} }
} }
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_KEYDOWN: case WM_KEYDOWN:
// While this probably should be (HIWORD(lParam) & KF_REPEAT), this seems // While this probably should be (HIWORD(lParam) & KF_REPEAT), this seems
// to be what the assembly is actually doing // to be what the assembly is actually doing
if (lParam & (KF_REPEAT << 16)) { if (lParam & (KF_REPEAT << 16)) {
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
} }
type = c_notificationKeyPress; type = c_notificationKeyPress;
keyCode = wParam; keyCode = wParam;
@ -513,7 +513,7 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
break; break;
default: default:
return DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
} }
if (g_isle) { if (g_isle) {
@ -550,7 +550,7 @@ MxResult IsleApp::SetupWindow(HINSTANCE hInstance, LPSTR lpCmdLine)
m_backBuffersInVram, m_backBuffersInVram,
m_using8bit, m_using8bit,
m_using16bit, m_using16bit,
m_unk0x24, m_hasLightSupport,
FALSE, FALSE,
m_wideViewAngle, m_wideViewAngle,
m_deviceId m_deviceId
@ -559,7 +559,7 @@ MxResult IsleApp::SetupWindow(HINSTANCE hInstance, LPSTR lpCmdLine)
MxOmni::SetSound3D(m_use3dSound); MxOmni::SetSound3D(m_use3dSound);
srand(timeGetTime() / 1000); srand(timeGetTime() / 1000);
SystemParametersInfoA(SPI_SETMOUSETRAILS, 0, NULL, 0); SystemParametersInfo(SPI_SETMOUSETRAILS, 0, NULL, 0);
ZeroMemory(&wndclass, sizeof(WNDCLASSA)); ZeroMemory(&wndclass, sizeof(WNDCLASSA));
@ -567,22 +567,22 @@ MxResult IsleApp::SetupWindow(HINSTANCE hInstance, LPSTR lpCmdLine)
wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc; wndclass.lpfnWndProc = WndProc;
wndclass.cbWndExtra = 0; wndclass.cbWndExtra = 0;
wndclass.hIcon = LoadIconA(hInstance, MAKEINTRESOURCEA(APP_ICON)); wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(APP_ICON));
wndclass.hCursor = m_cursorArrow = m_cursorCurrent = LoadCursorA(hInstance, MAKEINTRESOURCEA(ISLE_ARROW)); wndclass.hCursor = m_cursorArrow = m_cursorCurrent = LoadCursor(hInstance, MAKEINTRESOURCE(ISLE_ARROW));
m_cursorBusy = LoadCursorA(hInstance, MAKEINTRESOURCEA(ISLE_BUSY)); m_cursorBusy = LoadCursor(hInstance, MAKEINTRESOURCE(ISLE_BUSY));
m_cursorNo = LoadCursorA(hInstance, MAKEINTRESOURCEA(ISLE_NO)); m_cursorNo = LoadCursor(hInstance, MAKEINTRESOURCE(ISLE_NO));
wndclass.hInstance = hInstance; wndclass.hInstance = hInstance;
wndclass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wndclass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
wndclass.lpszClassName = WNDCLASS_NAME; wndclass.lpszClassName = WNDCLASS_NAME;
if (!RegisterClassA(&wndclass)) { if (!RegisterClass(&wndclass)) {
return FAILURE; return FAILURE;
} }
if (m_fullScreen) { if (m_fullScreen) {
AdjustWindowRectEx(&g_windowRect, WS_CAPTION | WS_SYSMENU, 0, WS_EX_APPWINDOW); AdjustWindowRectEx(&g_windowRect, WS_CAPTION | WS_SYSMENU, 0, WS_EX_APPWINDOW);
m_windowHandle = CreateWindowExA( m_windowHandle = CreateWindowEx(
WS_EX_APPWINDOW, WS_EX_APPWINDOW,
WNDCLASS_NAME, WNDCLASS_NAME,
WINDOW_TITLE, WINDOW_TITLE,
@ -600,7 +600,7 @@ MxResult IsleApp::SetupWindow(HINSTANCE hInstance, LPSTR lpCmdLine)
else { else {
AdjustWindowRectEx(&g_windowRect, WS_CAPTION | WS_SYSMENU, 0, WS_EX_APPWINDOW); AdjustWindowRectEx(&g_windowRect, WS_CAPTION | WS_SYSMENU, 0, WS_EX_APPWINDOW);
m_windowHandle = CreateWindowExA( m_windowHandle = CreateWindowEx(
WS_EX_APPWINDOW, WS_EX_APPWINDOW,
WNDCLASS_NAME, WNDCLASS_NAME,
WINDOW_TITLE, WINDOW_TITLE,
@ -690,8 +690,8 @@ BOOL IsleApp::ReadReg(LPCSTR name, LPSTR outValue, DWORD outSize)
BOOL out = FALSE; BOOL out = FALSE;
DWORD size = outSize; DWORD size = outSize;
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Mindscape\\LEGO Island", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Mindscape\\LEGO Island", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
if (RegQueryValueExA(hKey, name, NULL, &valueType, (LPBYTE) outValue, &size) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, name, NULL, &valueType, (LPBYTE) outValue, &size) == ERROR_SUCCESS) {
if (RegCloseKey(hKey) == ERROR_SUCCESS) { if (RegCloseKey(hKey) == ERROR_SUCCESS) {
out = TRUE; out = TRUE;
} }

View File

@ -56,7 +56,7 @@ class IsleApp {
BOOL m_backBuffersInVram; // 0x18 BOOL m_backBuffersInVram; // 0x18
BOOL m_using8bit; // 0x1c BOOL m_using8bit; // 0x1c
BOOL m_using16bit; // 0x20 BOOL m_using16bit; // 0x20
int m_unk0x24; // 0x24 BOOL m_hasLightSupport; // 0x24
BOOL m_use3dSound; // 0x28 BOOL m_use3dSound; // 0x28
BOOL m_useMusic; // 0x2c BOOL m_useMusic; // 0x2c
BOOL m_useJoystick; // 0x30 BOOL m_useJoystick; // 0x30

View File

@ -10,6 +10,7 @@ const char* g_strANIMATION = "ANIMATION";
// GLOBAL: LEGO1 0x10102050 // GLOBAL: LEGO1 0x10102050
// STRING: LEGO1 0x10102024 // STRING: LEGO1 0x10102024
// GLOBAL: BETA10 0x102028b4
const char* g_strATTACH_CAMERA = "ATTACH_CAMERA"; const char* g_strATTACH_CAMERA = "ATTACH_CAMERA";
// GLOBAL: LEGO1 0x10102054 // GLOBAL: LEGO1 0x10102054
@ -138,6 +139,7 @@ const char* g_strBMP_ISMAP = "BMP_ISMAP";
// GLOBAL: LEGO1 0x101020e4 // GLOBAL: LEGO1 0x101020e4
// STRING: LEGO1 0x10101eac // STRING: LEGO1 0x10101eac
// GLOBAL: BETA10 0x10202948
const char* g_parseExtraTokens = ":;"; const char* g_parseExtraTokens = ":;";
// GLOBAL: LEGO1 0x100f0c14 // GLOBAL: LEGO1 0x100f0c14

View File

@ -129,7 +129,7 @@ class Act3 : public LegoWorld {
void RemoveDonut(Act3Ammo& p_p); void RemoveDonut(Act3Ammo& p_p);
MxResult ShootPizza(LegoPathController* p_controller, Vector3& p_location, Vector3& p_direction, Vector3& p_up); MxResult ShootPizza(LegoPathController* p_controller, Vector3& p_location, Vector3& p_direction, Vector3& p_up);
MxResult ShootDonut(LegoPathController* p_controller, Vector3& p_location, Vector3& p_direction, Vector3& p_up); MxResult ShootDonut(LegoPathController* p_controller, Vector3& p_location, Vector3& p_direction, Vector3& p_up);
void FUN_10072ad0(undefined4 p_param1); void TriggerHitSound(undefined4 p_param1);
MxResult FUN_10073360(Act3Ammo& p_ammo, const Vector3& p_param2); MxResult FUN_10073360(Act3Ammo& p_ammo, const Vector3& p_param2);
MxResult FUN_10073390(Act3Ammo& p_ammo, const Vector3& p_param2); MxResult FUN_10073390(Act3Ammo& p_ammo, const Vector3& p_param2);
void SetBrickster(Act3Brickster* p_brickster); void SetBrickster(Act3Brickster* p_brickster);
@ -168,12 +168,12 @@ class Act3 : public LegoWorld {
Helicopter* m_copter; // 0x420c Helicopter* m_copter; // 0x420c
Act3Shark* m_shark; // 0x4210 Act3Shark* m_shark; // 0x4210
MxFloat m_time; // 0x4214 MxFloat m_time; // 0x4214
MxU8 m_unk0x4218; // 0x4218 MxU8 m_pizzaHitSound; // 0x4218
MxU8 m_unk0x4219; // 0x4219 MxU8 m_pizzaMissSound; // 0x4219
MxU8 m_unk0x421a; // 0x421a MxU8 m_copDonutSound; // 0x421a
MxU8 m_unk0x421b; // 0x421b MxU8 m_donutMissSound; // 0x421b
MxU8 m_unk0x421c; // 0x421c MxU8 m_islanderSound; // 0x421c
MxU8 m_unk0x421d; // 0x421d MxU8 m_bricksterDonutSound; // 0x421d
undefined m_unk0x421e; // 0x421e undefined m_unk0x421e; // 0x421e
Act3List m_unk0x4220; // 0x4220 Act3List m_unk0x4220; // 0x4220
MxPresenter* m_helicopterDots[15]; // 0x4230 MxPresenter* m_helicopterDots[15]; // 0x4230

View File

@ -140,7 +140,7 @@ class Act3Brickster : public Act3Actor {
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
void SwitchBoundary( void SwitchBoundary(
LegoPathBoundary*& p_boundary, LegoPathBoundary*& p_boundary,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
float& p_unk0xe4 float& p_unk0xe4
) override; // vtable+0x98 ) override; // vtable+0x98
MxResult VTable0x9c() override; // vtable+0x9c MxResult VTable0x9c() override; // vtable+0x9c

View File

@ -11,6 +11,12 @@ class MxEndActionNotificationParam;
// SIZE 0x24 // SIZE 0x24
class AmbulanceMissionState : public LegoState { class AmbulanceMissionState : public LegoState {
public: public:
enum {
e_ready = 0,
e_enteredAmbulance = 1,
e_prepareAmbulance = 2,
};
AmbulanceMissionState(); AmbulanceMissionState();
// FUNCTION: LEGO1 0x10037440 // FUNCTION: LEGO1 0x10037440
@ -125,18 +131,18 @@ class AmbulanceMissionState : public LegoState {
// SYNTHETIC: LEGO1 0x100376c0 // SYNTHETIC: LEGO1 0x100376c0
// AmbulanceMissionState::`scalar deleting destructor' // AmbulanceMissionState::`scalar deleting destructor'
undefined4 m_unk0x08; // 0x08 MxU32 m_state; // 0x08
MxLong m_startTime; // 0x0c MxLong m_startTime; // 0x0c
MxS16 m_peScore; // 0x10 MxS16 m_peScore; // 0x10
MxS16 m_maScore; // 0x12 MxS16 m_maScore; // 0x12
MxS16 m_paScore; // 0x14 MxS16 m_paScore; // 0x14
MxS16 m_niScore; // 0x16 MxS16 m_niScore; // 0x16
MxS16 m_laScore; // 0x18 MxS16 m_laScore; // 0x18
MxS16 m_peHighScore; // 0x1a MxS16 m_peHighScore; // 0x1a
MxS16 m_maHighScore; // 0x1c MxS16 m_maHighScore; // 0x1c
MxS16 m_paHighScore; // 0x1e MxS16 m_paHighScore; // 0x1e
MxS16 m_niHighScore; // 0x20 MxS16 m_niHighScore; // 0x20
MxS16 m_laHighScore; // 0x22 MxS16 m_laHighScore; // 0x22
}; };
// VTABLE: LEGO1 0x100d71a8 // VTABLE: LEGO1 0x100d71a8
@ -177,15 +183,21 @@ class Ambulance : public IslePathActor {
virtual MxLong HandleEndAction(MxEndActionNotificationParam& p_param); // vtable+0xf4 virtual MxLong HandleEndAction(MxEndActionNotificationParam& p_param); // vtable+0xf4
void CreateState(); void CreateState();
void FUN_10036e60(); void Init();
void ActivateSceneActions(); void ActivateSceneActions();
void StopActions(); void StopActions();
void FUN_10037250(); void Reset();
// SYNTHETIC: LEGO1 0x10036130 // SYNTHETIC: LEGO1 0x10036130
// Ambulance::`scalar deleting destructor' // Ambulance::`scalar deleting destructor'
private: private:
enum {
e_none = 0,
e_waiting = 1,
e_finished = 3,
};
void PlayAnimation(IsleScript::Script p_objectId); void PlayAnimation(IsleScript::Script p_objectId);
void PlayFinalAnimation(IsleScript::Script p_objectId); void PlayFinalAnimation(IsleScript::Script p_objectId);
void StopAction(IsleScript::Script p_objectId); void StopAction(IsleScript::Script p_objectId);
@ -196,9 +208,9 @@ class Ambulance : public IslePathActor {
AmbulanceMissionState* m_state; // 0x164 AmbulanceMissionState* m_state; // 0x164
MxS16 m_unk0x168; // 0x168 MxS16 m_unk0x168; // 0x168
MxS16 m_actorId; // 0x16a MxS16 m_actorId; // 0x16a
MxS16 m_unk0x16c; // 0x16c MxS16 m_atPoliceTask; // 0x16c
MxS16 m_unk0x16e; // 0x16e MxS16 m_atBeachTask; // 0x16e
MxS16 m_unk0x170; // 0x170 MxS16 m_taskState; // 0x170
MxS16 m_unk0x172; // 0x172 MxS16 m_unk0x172; // 0x172
IsleScript::Script m_lastAction; // 0x174 IsleScript::Script m_lastAction; // 0x174
IsleScript::Script m_lastAnimation; // 0x178 IsleScript::Script m_lastAnimation; // 0x178

View File

@ -52,13 +52,13 @@ class CarRace : public LegoRace {
return !strcmp(p_name, CarRace::ClassName()) || LegoRace::IsA(p_name); return !strcmp(p_name, CarRace::ClassName()) || LegoRace::IsA(p_name);
} }
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64
MxLong HandleClick(LegoEventNotificationParam&) override; // vtable+0x6c MxLong HandleControl(LegoControlManagerNotificationParam&) override; // vtable+0x6c
MxLong HandlePathStruct(LegoPathStructNotificationParam&) override; // vtable+0x70 MxLong HandlePathStruct(LegoPathStructNotificationParam&) override; // vtable+0x70
MxLong HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74 MxLong HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74
MxLong HandleType0Notification(MxNotificationParam&) override; // vtable+0x78 MxLong HandleType0Notification(MxNotificationParam&) override; // vtable+0x78
// FUNCTION: BETA10 0x100cd060 // FUNCTION: BETA10 0x100cd060
RaceSkel* GetSkeleton() { return m_skeleton; } RaceSkel* GetSkeleton() { return m_skeleton; }

View File

@ -14,6 +14,19 @@ class MxStillPresenter;
// SIZE 0x24 // SIZE 0x24
class GasStationState : public LegoState { class GasStationState : public LegoState {
public: public:
enum {
e_unknown0 = 0,
e_newState = 1,
e_beforeExitingForQuest = 2,
e_unknown3 = 3,
e_unknown4 = 4,
e_introduction = 5,
e_explainQuest = 6,
e_waitAcceptingQuest = 7,
e_afterAcceptingQuest = 8,
e_cancelQuest = 9,
};
GasStationState(); GasStationState();
// FUNCTION: LEGO1 0x100061d0 // FUNCTION: LEGO1 0x100061d0
@ -42,7 +55,7 @@ class GasStationState : public LegoState {
// TODO: Most likely getters/setters are not used according to BETA. // TODO: Most likely getters/setters are not used according to BETA.
GarageScript::Script m_actions[3]; // 0x08 GarageScript::Script m_actions[3]; // 0x08
undefined4 m_unk0x14; // 0x14 MxS32 m_state; // 0x14
MxS16 m_pepperAction; // 0x18 MxS16 m_pepperAction; // 0x18
MxS16 m_mamaAction; // 0x1a MxS16 m_mamaAction; // 0x1a
MxS16 m_papaAction; // 0x1c MxS16 m_papaAction; // 0x1c
@ -88,6 +101,13 @@ class GasStation : public LegoWorld {
// GasStation::`scalar deleting destructor' // GasStation::`scalar deleting destructor'
private: private:
enum {
e_finished = 0,
e_start = 1,
e_started = 2,
e_canceled = 3,
};
inline void PlayAction(GarageScript::Script p_objectId); inline void PlayAction(GarageScript::Script p_objectId);
inline void StopAction(GarageScript::Script p_objectId); inline void StopAction(GarageScript::Script p_objectId);
@ -99,13 +119,13 @@ class GasStation : public LegoWorld {
undefined2 m_unk0xfa; // 0xfa undefined2 m_unk0xfa; // 0xfa
LegoGameState::Area m_destLocation; // 0xfc LegoGameState::Area m_destLocation; // 0xfc
GasStationState* m_state; // 0x100 GasStationState* m_state; // 0x100
undefined2 m_unk0x104; // 0x104 MxS16 m_waitingState; // 0x104
undefined2 m_unk0x106; // 0x106 MxS16 m_setWithCurrentAction; // 0x106
MxStillPresenter* m_trackLedBitmap; // 0x108 MxStillPresenter* m_trackLedBitmap; // 0x108
MxLong m_unk0x10c; // 0x10c MxLong m_lastIdleAnimation; // 0x10c
MxLong m_trackLedTimer; // 0x110 MxLong m_trackLedTimer; // 0x110
MxBool m_unk0x114; // 0x114 MxBool m_waiting; // 0x114
MxBool m_unk0x115; // 0x115 MxBool m_flashingLeds; // 0x115
Radio m_radio; // 0x118 Radio m_radio; // 0x118
}; };

View File

@ -16,6 +16,24 @@ class MxStillPresenter;
// SIZE 0x18 // SIZE 0x18
class HospitalState : public LegoState { class HospitalState : public LegoState {
public: public:
enum {
e_exitToClose = 0,
e_newState = 1,
e_unknown3 = 3,
e_unknown4 = 4,
e_introduction = 5,
e_explainQuestShort = 6,
e_explainQuest = 7,
e_waitAcceptingQuest = 8,
e_beforeEnteringAmbulance = 9,
e_unknown10 = 10, // Can never be reached
e_unknown11 = 11, // Can only be reached via e_unknown10
e_afterAcceptingQuest = 12,
e_exitImmediately = 13,
e_exitToInfocenter = 14,
e_exitToFront = 15,
};
HospitalState(); HospitalState();
~HospitalState() override {} ~HospitalState() override {}
@ -40,13 +58,13 @@ class HospitalState : public LegoState {
// TODO: Most likely getters/setters are not used according to BETA. // TODO: Most likely getters/setters are not used according to BETA.
undefined4 m_unk0x08; // 0x08 MxS32 m_state; // 0x08
MxS16 m_unk0x0c; // 0x0c MxS16 m_stateActor; // 0x0c
MxS16 m_unk0x0e; // 0x0e MxS16 m_statePepper; // 0x0e
MxS16 m_unk0x10; // 0x10 MxS16 m_stateMama; // 0x10
MxS16 m_unk0x12; // 0x12 MxS16 m_statePapa; // 0x12
MxS16 m_unk0x14; // 0x14 MxS16 m_stateNick; // 0x14
MxS16 m_unk0x16; // 0x16 MxS16 m_stateLaura; // 0x16
}; };
// VTABLE: LEGO1 0x100d9730 // VTABLE: LEGO1 0x100d9730
@ -95,17 +113,17 @@ class Hospital : public LegoWorld {
MxS16 m_currentActorId; // 0xf8 MxS16 m_currentActorId; // 0xf8
LegoGameState::Area m_destLocation; // 0xfc LegoGameState::Area m_destLocation; // 0xfc
undefined2 m_unk0x100; // 0x100 MxU16 m_interactionMode; // 0x100
HospitalState* m_hospitalState; // 0x104 HospitalState* m_hospitalState; // 0x104
undefined2 m_unk0x108; // 0x108 MxU16 m_setWithCurrentAction; // 0x108
HospitalScript::Script m_currentAction; // 0x10c HospitalScript::Script m_currentAction; // 0x10c
MxStillPresenter* m_copLedBitmap; // 0x110 MxStillPresenter* m_copLedBitmap; // 0x110
MxStillPresenter* m_pizzaLedBitmap; // 0x114 MxStillPresenter* m_pizzaLedBitmap; // 0x114
undefined m_unk0x118; // 0x118 MxBool m_flashingLeds; // 0x118
MxLong m_copLedAnimTimer; // 0x11c MxLong m_copLedAnimTimer; // 0x11c
MxLong m_pizzaLedAnimTimer; // 0x120 MxLong m_pizzaLedAnimTimer; // 0x120
MxLong m_time; // 0x124 MxLong m_time; // 0x124
undefined m_unk0x128; // 0x128 MxBool m_exited; // 0x128
}; };
#endif // HOSPITAL_H #endif // HOSPITAL_H

View File

@ -78,10 +78,20 @@ class InfocenterState : public LegoState {
// SIZE 0x18 // SIZE 0x18
struct InfocenterMapEntry { struct InfocenterMapEntry {
enum {
e_infocenter = 3,
e_jetrace = 10,
e_carrace = 11,
e_pizzeria = 12,
e_garage = 13,
e_hospital = 14,
e_police = 15,
};
InfocenterMapEntry(); InfocenterMapEntry();
MxStillPresenter* m_destCtl; // 0x00 MxStillPresenter* m_destCtl; // 0x00
undefined4 m_unk0x04; // 0x04 MxU32 m_target; // 0x04
MxRect<MxS32> m_area; // 0x08 MxRect<MxS32> m_area; // 0x08
}; };
@ -154,7 +164,7 @@ class Infocenter : public LegoWorld {
void PlayCutscene(Cutscene p_entityId, MxBool p_scale); void PlayCutscene(Cutscene p_entityId, MxBool p_scale);
void StopCutscene(); void StopCutscene();
void FUN_10070d10(MxS32 p_x, MxS32 p_y); void UpdateEnabledGlowControl(MxS32 p_x, MxS32 p_y);
void StartCredits(); void StartCredits();
void StopCredits(); void StopCredits();
@ -173,12 +183,12 @@ class Infocenter : public LegoWorld {
Radio m_radio; // 0x10c Radio m_radio; // 0x10c
MxStillPresenter* m_dragPresenter; // 0x11c MxStillPresenter* m_dragPresenter; // 0x11c
InfocenterMapEntry m_glowInfo[7]; // 0x120 InfocenterMapEntry m_glowInfo[7]; // 0x120
MxS16 m_unk0x1c8; // 0x1c8 MxS16 m_enabledGlowControl; // 0x1c8
MxStillPresenter* m_frame; // 0x1cc MxStillPresenter* m_frame; // 0x1cc
MxS16 m_infoManDialogueTimer; // 0x1d0 MxS16 m_infoManDialogueTimer; // 0x1d0
MxS16 m_bookAnimationTimer; // 0x1d2 MxS16 m_bookAnimationTimer; // 0x1d2
MxU16 m_unk0x1d4; // 0x1d4 MxU16 m_playingMovieCounter; // 0x1d4
MxS16 m_unk0x1d6; // 0x1d6 MxS16 m_bigInfoBlinkTimer; // 0x1d6
}; };
#endif // INFOCENTER_H #endif // INFOCENTER_H

View File

@ -29,12 +29,12 @@ class JetskiRace : public LegoRace {
return !strcmp(p_name, JetskiRace::ClassName()) || LegoRace::IsA(p_name); return !strcmp(p_name, JetskiRace::ClassName()) || LegoRace::IsA(p_name);
} }
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64
MxLong HandleClick(LegoEventNotificationParam&) override; // vtable+0x6c MxLong HandleControl(LegoControlManagerNotificationParam&) override; // vtable+0x6c
MxLong HandlePathStruct(LegoPathStructNotificationParam&) override; // vtable+0x70 MxLong HandlePathStruct(LegoPathStructNotificationParam&) override; // vtable+0x70
MxLong HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74 MxLong HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74
void FUN_10016930(MxS32 p_param1, MxS16 p_param2); void FUN_10016930(MxS32 p_param1, MxS16 p_param2);

View File

@ -34,6 +34,7 @@ class LegoActor : public LegoEntity {
} }
// FUNCTION: LEGO1 0x1002d220 // FUNCTION: LEGO1 0x1002d220
// FUNCTION: BETA10 0x10012530
MxBool IsA(const char* p_name) const override // vtable+0x10 MxBool IsA(const char* p_name) const override // vtable+0x10
{ {
return !strcmp(p_name, LegoActor::ClassName()) || LegoEntity::IsA(p_name); return !strcmp(p_name, LegoActor::ClassName()) || LegoEntity::IsA(p_name);
@ -43,18 +44,22 @@ class LegoActor : public LegoEntity {
void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24 void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24
// FUNCTION: LEGO1 0x10002cc0 // FUNCTION: LEGO1 0x10002cc0
// FUNCTION: BETA10 0x1000f3e0
virtual MxFloat GetSoundFrequencyFactor() { return m_frequencyFactor; } // vtable+0x50 virtual MxFloat GetSoundFrequencyFactor() { return m_frequencyFactor; } // vtable+0x50
// FUNCTION: LEGO1 0x10002cd0 // FUNCTION: LEGO1 0x10002cd0
// FUNCTION: BETA10 0x1000f410
virtual void SetSoundFrequencyFactor(MxFloat p_frequencyFactor) virtual void SetSoundFrequencyFactor(MxFloat p_frequencyFactor)
{ {
m_frequencyFactor = p_frequencyFactor; m_frequencyFactor = p_frequencyFactor;
} // vtable+0x54 } // vtable+0x54
// FUNCTION: LEGO1 0x10002ce0 // FUNCTION: LEGO1 0x10002ce0
// FUNCTION: BETA10 0x1000f440
virtual void VTable0x58(MxFloat p_unk0x70) { m_unk0x70 = p_unk0x70; } // vtable+0x58 virtual void VTable0x58(MxFloat p_unk0x70) { m_unk0x70 = p_unk0x70; } // vtable+0x58
// FUNCTION: LEGO1 0x10002cf0 // FUNCTION: LEGO1 0x10002cf0
// FUNCTION: BETA10 0x1000f470
virtual MxFloat VTable0x5c() { return m_unk0x70; } // vtable+0x5c virtual MxFloat VTable0x5c() { return m_unk0x70; } // vtable+0x5c
// FUNCTION: LEGO1 0x10002d00 // FUNCTION: LEGO1 0x10002d00
@ -62,6 +67,7 @@ class LegoActor : public LegoEntity {
virtual MxU8 GetActorId() { return m_actorId; } // vtable+0x60 virtual MxU8 GetActorId() { return m_actorId; } // vtable+0x60
// FUNCTION: LEGO1 0x10002d10 // FUNCTION: LEGO1 0x10002d10
// FUNCTION: BETA10 0x1000f4d0
virtual void SetActorId(MxU8 p_actorId) { m_actorId = p_actorId; } // vtable+0x64 virtual void SetActorId(MxU8 p_actorId) { m_actorId = p_actorId; } // vtable+0x64
static const char* GetActorName(MxU8 p_id); static const char* GetActorName(MxU8 p_id);
@ -76,6 +82,7 @@ class LegoActor : public LegoEntity {
}; };
// SYNTHETIC: LEGO1 0x1002d300 // SYNTHETIC: LEGO1 0x1002d300
// SYNTHETIC: BETA10 0x1003d900
// LegoActor::`scalar deleting destructor' // LegoActor::`scalar deleting destructor'
#endif // LEGOACTOR_H #endif // LEGOACTOR_H

View File

@ -11,12 +11,12 @@ class LegoROI;
struct LegoActorInfo { struct LegoActorInfo {
// SIZE 0x18 // SIZE 0x18
struct Part { struct Part {
MxU8* m_unk0x00; // 0x00 MxU8* m_partNameIndices; // 0x00
const char** m_unk0x04; // 0x04 const char** m_partName; // 0x04
MxU8 m_unk0x08; // 0x08 MxU8 m_partNameIndex; // 0x08
MxU8* m_unk0x0c; // 0x0c MxU8* m_nameIndices; // 0x0c
const char** m_unk0x10; // 0x10 const char** m_names; // 0x10
MxU8 m_unk0x14; // 0x14 MxU8 m_nameIndex; // 0x14
}; };
const char* m_name; // 0x00 const char* m_name; // 0x00
@ -31,8 +31,8 @@ struct LegoActorInfo {
// SIZE 0x58 // SIZE 0x58
struct LegoActorLOD { struct LegoActorLOD {
enum { enum {
c_flag1 = 0x01, c_useTexture = 0x01,
c_flag2 = 0x02 c_useColor = 0x02
}; };
const char* m_name; // 0x00 const char* m_name; // 0x00

View File

@ -16,7 +16,7 @@ class LegoFile;
class LegoPathActor; class LegoPathActor;
class LegoPathBoundary; class LegoPathBoundary;
class LegoROIList; class LegoROIList;
struct LegoUnknown100db7f4; struct LegoOrientedEdge;
class LegoWorld; class LegoWorld;
class MxDSAction; class MxDSAction;
@ -32,20 +32,20 @@ struct ModelInfo {
// SIZE 0x30 // SIZE 0x30
struct AnimInfo { struct AnimInfo {
char* m_name; // 0x00 char* m_name; // 0x00
MxU32 m_objectId; // 0x04 MxU32 m_objectId; // 0x04
MxS16 m_location; // 0x08 MxS16 m_location; // 0x08
MxBool m_unk0x0a; // 0x0a MxBool m_unk0x0a; // 0x0a
MxU8 m_unk0x0b; // 0x0b MxU8 m_unk0x0b; // 0x0b
MxU8 m_unk0x0c; // 0x0c MxU8 m_unk0x0c; // 0x0c
MxU8 m_unk0x0d; // 0x0d MxU8 m_unk0x0d; // 0x0d
float m_unk0x10[4]; // 0x10 float m_unk0x10[4]; // 0x10
MxU8 m_modelCount; // 0x20 MxU8 m_modelCount; // 0x20
MxU16 m_unk0x22; // 0x22 MxU16 m_unk0x22; // 0x22
ModelInfo* m_models; // 0x24 ModelInfo* m_models; // 0x24
MxS8 m_unk0x28; // 0x28 MxS8 m_characterIndex; // 0x28
MxBool m_unk0x29; // 0x29 MxBool m_unk0x29; // 0x29
MxS8 m_unk0x2a[3]; // 0x2a MxS8 m_unk0x2a[3]; // 0x2a
}; };
// VTABLE: LEGO1 0x100d8d80 // VTABLE: LEGO1 0x100d8d80
@ -240,7 +240,7 @@ class LegoAnimationManager : public MxCore {
void FUN_10063d10(); void FUN_10063d10();
void FUN_10063e40(LegoAnimPresenter* p_presenter); void FUN_10063e40(LegoAnimPresenter* p_presenter);
MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world); MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world);
MxBool FUN_10064010(LegoPathBoundary* p_boundary, LegoUnknown100db7f4* p_edge, float p_destScale); MxBool FUN_10064010(LegoPathBoundary* p_boundary, LegoOrientedEdge* p_edge, float p_destScale);
MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2); MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2);
MxResult FUN_10064380( MxResult FUN_10064380(
const char* p_name, const char* p_name,
@ -284,7 +284,7 @@ class LegoAnimationManager : public MxCore {
MxLong m_unk0x410; // 0x410 MxLong m_unk0x410; // 0x410
MxU32 m_unk0x414; // 0x414 MxU32 m_unk0x414; // 0x414
MxU32 m_numAllowedExtras; // 0x418 MxU32 m_numAllowedExtras; // 0x418
undefined4 m_unk0x41c; // 0x41c MxU32 m_maxAllowedExtras; // 0x41c
AnimState* m_animState; // 0x420 AnimState* m_animState; // 0x420
LegoROIList* m_unk0x424; // 0x424 LegoROIList* m_unk0x424; // 0x424
MxBool m_suspendedEnableCamAnims; // 0x428 MxBool m_suspendedEnableCamAnims; // 0x428

View File

@ -90,7 +90,7 @@ class LegoAnimMMPresenter : public MxCompositePresenter {
MxU8 m_unk0x59; // 0x59 MxU8 m_unk0x59; // 0x59
MxU32 m_animmanId; // 0x5c MxU32 m_animmanId; // 0x5c
LegoTranInfo* m_tranInfo; // 0x60 LegoTranInfo* m_tranInfo; // 0x60
LegoWorld* m_unk0x64; // 0x64 LegoWorld* m_world; // 0x64
MxMatrix* m_unk0x68; // 0x68 MxMatrix* m_unk0x68; // 0x68
LegoROI** m_roiMap; // 0x6c LegoROI** m_roiMap; // 0x6c
MxU32 m_roiMapSize; // 0x70 MxU32 m_roiMapSize; // 0x70

View File

@ -103,12 +103,17 @@ class LegoAnimPresenter : public MxVideoPresenter {
LegoChar* FUN_10069150(const LegoChar* p_und1); LegoChar* FUN_10069150(const LegoChar* p_und1);
void FUN_100692b0(); void FUN_100692b0();
void FUN_100695c0(); void FUN_100695c0();
LegoChar* FUN_100697c0(const LegoChar* p_und1, const LegoChar* p_und2); LegoChar* GetVariableOrIdentity(const LegoChar* p_varName, const LegoChar* p_prefix);
LegoBool FUN_100698b0(const CompoundObject& p_rois, const LegoChar* p_und2); LegoBool FUN_100698b0(const CompoundObject& p_rois, const LegoChar* p_und2);
LegoROI* FUN_100699e0(const LegoChar* p_und); LegoROI* FindROI(const LegoChar* p_name);
void FUN_10069b10(); void FUN_10069b10();
void FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi); void UpdateStructMapAndROIIndex(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi);
void FUN_1006a4f0(LegoAnimStructMap& p_map, LegoAnimNodeData* p_data, const LegoChar* p_und, LegoROI* p_roi); void UpdateStructMapAndROIIndexForNode(
LegoAnimStructMap& p_map,
LegoAnimNodeData* p_data,
const LegoChar* p_und,
LegoROI* p_roi
);
void FUN_1006aa60(); void FUN_1006aa60();
void FUN_1006ab70(); void FUN_1006ab70();
LegoBool FUN_1006aba0(); LegoBool FUN_1006aba0();
@ -116,13 +121,13 @@ class LegoAnimPresenter : public MxVideoPresenter {
void SubstituteVariables(); void SubstituteVariables();
void FUN_1006b900(LegoAnim* p_anim, MxLong p_time, Matrix4* p_matrix); void FUN_1006b900(LegoAnim* p_anim, MxLong p_time, Matrix4* p_matrix);
void FUN_1006b9a0(LegoAnim* p_anim, MxLong p_time, Matrix4* p_matrix); void FUN_1006b9a0(LegoAnim* p_anim, MxLong p_time, Matrix4* p_matrix);
void FUN_1006c8a0(MxBool p_bool); void SetDisabled(MxBool p_disabled);
LegoAnim* m_anim; // 0x64 LegoAnim* m_anim; // 0x64
LegoROI** m_roiMap; // 0x68 LegoROI** m_roiMap; // 0x68
MxU32 m_roiMapSize; // 0x6c MxU32 m_roiMapSize; // 0x6c
LegoROIList* m_unk0x70; // 0x70 LegoROIList* m_sceneROIs; // 0x70
LegoROIList* m_unk0x74; // 0x74 LegoROIList* m_managedActors; // 0x74
Matrix4* m_unk0x78; // 0x78 Matrix4* m_unk0x78; // 0x78
MxU32 m_flags; // 0x7c MxU32 m_flags; // 0x7c
LegoWorld* m_currentWorld; // 0x80 LegoWorld* m_currentWorld; // 0x80

View File

@ -26,10 +26,10 @@ struct LegoBuildingInfo {
MxU32 m_sound; // 0x08 MxU32 m_sound; // 0x08
MxU32 m_move; // 0x0c MxU32 m_move; // 0x0c
MxU8 m_mood; // 0x10 MxU8 m_mood; // 0x10
MxS8 m_unk0x11; // 0x11 MxS8 m_counter; // 0x11
MxS8 m_initialUnk0x11; // 0x12 - initial value loaded to m_unk0x11 MxS8 m_initialCounter; // 0x12 - initial value loaded to m_counter
MxU8 m_flags; // 0x13 MxU8 m_flags; // 0x13
float m_unk0x14; // 0x14 float m_adjustedY; // 0x14
const char* m_boundaryName; // 0x18 const char* m_boundaryName; // 0x18
float m_x; // 0x1c float m_x; // 0x1c
float m_y; // 0x20 float m_y; // 0x20
@ -46,7 +46,7 @@ class LegoBuildingManager : public MxCore {
LegoEntity* m_entity; // 0x00 LegoEntity* m_entity; // 0x00
LegoROI* m_roi; // 0x04 LegoROI* m_roi; // 0x04
MxLong m_time; // 0x08 MxLong m_time; // 0x08
float m_unk0x0c; // 0x0c float m_y; // 0x0c
MxBool m_muted; // 0x10 MxBool m_muted; // 0x10
}; };
@ -78,17 +78,17 @@ class LegoBuildingManager : public MxCore {
MxBool SwitchMove(LegoEntity* p_entity); MxBool SwitchMove(LegoEntity* p_entity);
MxBool SwitchMood(LegoEntity* p_entity); MxBool SwitchMood(LegoEntity* p_entity);
MxU32 GetAnimationId(LegoEntity* p_entity); MxU32 GetAnimationId(LegoEntity* p_entity);
MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state); MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_basedOnMood);
MxBool FUN_10030000(LegoEntity* p_entity); MxBool DecrementCounter(LegoEntity* p_entity);
MxBool FUN_10030030(MxS32 p_index); MxBool DecrementCounter(MxS32 p_index);
MxBool FUN_10030110(LegoBuildingInfo* p_data); MxBool DecrementCounter(LegoBuildingInfo* p_data);
void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length, MxBool p_haveSound, MxBool p_unk0x28); void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length, MxBool p_haveSound, MxBool p_hideAfterAnimation);
void FUN_10030590(); void ClearCounters();
void AdjustHeight(MxS32 p_index); void AdjustHeight(MxS32 p_index);
MxResult FUN_10030630(); MxResult DetermineBoundaries();
LegoBuildingInfo* GetInfoArray(MxS32& p_length); LegoBuildingInfo* GetInfoArray(MxS32& p_length);
void FUN_100307b0(LegoEntity* p_entity, MxS32 p_adjust); void AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust);
void FUN_10030800(); void SetInitialCounters();
static const char* GetCustomizeAnimFile() { return g_customizeAnimFile; } static const char* GetCustomizeAnimFile() { return g_customizeAnimFile; }
@ -100,13 +100,13 @@ class LegoBuildingManager : public MxCore {
static MxS32 g_maxMove[16]; static MxS32 g_maxMove[16];
static MxU32 g_maxSound; static MxU32 g_maxSound;
MxU8 m_nextVariant; // 0x08 MxU8 m_nextVariant; // 0x08
MxBool m_unk0x09; // 0x09 MxBool m_boundariesDetermined; // 0x09
AnimEntry* m_entries[5]; // 0x0c AnimEntry* m_entries[5]; // 0x0c
MxS8 m_numEntries; // 0x20 MxS8 m_numEntries; // 0x20
LegoCacheSound* m_sound; // 0x24 LegoCacheSound* m_sound; // 0x24
MxBool m_unk0x28; // 0x28 MxBool m_hideAfterAnimation; // 0x28
LegoWorld* m_world; // 0x2c LegoWorld* m_world; // 0x2c
}; };
#endif // LEGOBUILDINGMANAGER_H #endif // LEGOBUILDINGMANAGER_H

View File

@ -135,15 +135,15 @@ class LegoCarBuild : public LegoWorld {
void FUN_10022f00(); void FUN_10022f00();
void FUN_10022f30(); void FUN_10022f30();
void FUN_10023130(MxLong p_x, MxLong p_y); void FUN_10023130(MxLong p_x, MxLong p_y);
void FUN_100236d0(); void AddSelectedPartToBuild();
undefined4 FUN_10024250(LegoEventNotificationParam* p_param); undefined4 FUN_10024250(LegoEventNotificationParam* p_param);
void FUN_100243a0(); void FUN_100243a0();
undefined4 FUN_10024480(MxActionNotificationParam* p_param); undefined4 FUN_10024480(MxActionNotificationParam* p_param);
undefined4 FUN_100244e0(MxLong p_x, MxLong p_y); undefined4 SelectPartFromMousePosition(MxLong p_x, MxLong p_y);
undefined4 FUN_100246e0(MxLong p_x, MxLong p_y); undefined4 FUN_100246e0(MxLong p_x, MxLong p_y);
MxS32 FUN_10024850(MxLong p_x, MxLong p_y); MxS32 FUN_10024850(MxLong p_x, MxLong p_y);
undefined4 FUN_10024890(MxParam* p_param); undefined4 FUN_10024890(MxParam* p_param);
undefined4 FUN_10024c20(LegoEventNotificationParam* p_param); undefined4 FUN_10024c20(MxNotificationParam* p_param);
void FUN_10024ef0(); void FUN_10024ef0();
void FUN_10024f30(); void FUN_10024f30();
void FUN_10024f50(); void FUN_10024f50();
@ -161,7 +161,7 @@ class LegoCarBuild : public LegoWorld {
MxS32 FUN_10025ee0(undefined4 p_param1); MxS32 FUN_10025ee0(undefined4 p_param1);
// FUNCTION: BETA10 0x100735b0 // FUNCTION: BETA10 0x100735b0
void SetUnknown0x258(LegoCarBuildAnimPresenter* p_unk0x258) { m_unk0x258 = p_unk0x258; } void SetCarBuildAnimPresenter(LegoCarBuildAnimPresenter* p_animPresenter) { m_animPresenter = p_animPresenter; }
// SYNTHETIC: LEGO1 0x10022a60 // SYNTHETIC: LEGO1 0x10022a60
// LegoCarBuild::`scalar deleting destructor' // LegoCarBuild::`scalar deleting destructor'
@ -182,7 +182,7 @@ class LegoCarBuild : public LegoWorld {
MxU8 m_unk0x109; // 0x109 MxU8 m_unk0x109; // 0x109
MxU16 m_unk0x10a; // 0x10a MxU16 m_unk0x10a; // 0x10a
DWORD m_unk0x10c; // 0x10c DWORD m_unk0x10c; // 0x10c
LegoROI* m_unk0x110; // 0x110 LegoROI* m_selectedPart; // 0x110
BoundingSphere m_unk0x114; // 0x114 BoundingSphere m_unk0x114; // 0x114
MxMatrix m_unk0x12c; // 0x12c MxMatrix m_unk0x12c; // 0x12c
undefined m_unk0x174; // 0x174 undefined m_unk0x174; // 0x174
@ -193,17 +193,17 @@ class LegoCarBuild : public LegoWorld {
// This is likely a location in pixel space // This is likely a location in pixel space
MxS32 m_unk0x250[2]; // 0x250 MxS32 m_unk0x250[2]; // 0x250
LegoCarBuildAnimPresenter* m_unk0x258; // 0x258 LegoCarBuildAnimPresenter* m_animPresenter; // 0x258
MxQuaternionTransformer m_unk0x25c; // 0x25c MxQuaternionTransformer m_unk0x25c; // 0x25c
// These two are likely locations in pixel space // These two are likely locations in pixel space
MxS32 m_unk0x290[2]; // 0x290 MxS32 m_unk0x290[2]; // 0x290
MxS32 m_unk0x298[2]; // 0x298 MxS32 m_unk0x298[2]; // 0x298
MxFloat m_unk0x2a0; // 0x2a0 MxFloat m_unk0x2a0; // 0x2a0
Mx4DPointFloat m_unk0x2a4; // 0x2a4 Mx4DPointFloat m_unk0x2a4; // 0x2a4
Mx4DPointFloat m_unk0x2bc; // 0x2bc Mx4DPointFloat m_unk0x2bc; // 0x2bc
MxBool m_unk0x2d4; // 0x2d4 MxBool m_selectedPartIsPlaced; // 0x2d4
// variable names verified by BETA10 0x1006b27a // variable names verified by BETA10 0x1006b27a
MxStillPresenter* m_ColorBook_Bitmap; // 0x2dc MxStillPresenter* m_ColorBook_Bitmap; // 0x2dc

View File

@ -13,6 +13,13 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
c_bit1 = 0x01 c_bit1 = 0x01
}; };
enum ShelfState {
e_undefined = -1,
e_selected = 0,
e_stopped = 1,
e_moving = 2
};
// SIZE 0x0c // SIZE 0x0c
struct UnknownListEntry { struct UnknownListEntry {
// FUNCTION: LEGO1 0x100795c0 // FUNCTION: LEGO1 0x100795c0
@ -69,16 +76,16 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
void FUN_10079050(MxS16 p_index); void FUN_10079050(MxS16 p_index);
void SwapNodesByName(LegoChar* p_param1, LegoChar* p_param2); void SwapNodesByName(LegoChar* p_param1, LegoChar* p_param2);
void FUN_10079160(); void InitBuildPlatform();
void FUN_100795d0(LegoChar* p_param); void HideBuildPartByName(LegoChar* p_param);
void FUN_10079680(LegoChar* p_param); void ShowBuildPartByName(LegoChar* p_param);
LegoAnimNodeData* FindNodeDataByName(LegoTreeNode* p_treeNode, const LegoChar* p_name); LegoAnimNodeData* FindNodeDataByName(LegoTreeNode* p_treeNode, const LegoChar* p_name);
LegoTreeNode* FindNodeByName(LegoTreeNode* p_treeNode, const LegoChar* p_name); LegoTreeNode* FindNodeByName(LegoTreeNode* p_treeNode, const LegoChar* p_name);
void FUN_10079790(const LegoChar* p_name); void AddPartToBuildByName(const LegoChar* p_name);
void RotateAroundYAxis(MxFloat p_angle); void RotateAroundYAxis(MxFloat p_angle);
MxBool FUN_10079c30(const LegoChar* p_name); MxBool FUN_10079c30(const LegoChar* p_name);
MxBool PartIsPlaced(const LegoChar* p_name); MxBool PartIsPlaced(const LegoChar* p_name);
void FUN_10079a90(); void MoveShelfForward();
MxBool StringEqualsPlatform(const LegoChar* p_string); MxBool StringEqualsPlatform(const LegoChar* p_string);
MxBool StringEqualsShelf(const LegoChar* p_string); MxBool StringEqualsShelf(const LegoChar* p_string);
MxBool StringEndsOnY(const LegoChar* p_string); MxBool StringEndsOnY(const LegoChar* p_string);
@ -87,10 +94,10 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
void SetPartObjectIdByName(const LegoChar* p_name, MxS16 p_objectId); void SetPartObjectIdByName(const LegoChar* p_name, MxS16 p_objectId);
// FUNCTION: BETA10 0x10070180 // FUNCTION: BETA10 0x10070180
void SetUnknown0xbc(undefined2 p_unk0xbc) { m_unk0xbc = p_unk0xbc; } void SetShelfState(MxU16 p_shelfState) { m_shelfState = p_shelfState; }
// FUNCTION: BETA10 0x100703b0 // FUNCTION: BETA10 0x100703b0
Matrix4& GetUnknown0xe0() { return m_unk0xe0; } Matrix4& GetBuildViewMatrix() { return m_buildViewMatrix; }
MxBool StringEndsOnW(LegoChar* p_param); MxBool StringEndsOnW(LegoChar* p_param);
MxBool StringEndsOnYOrN(const LegoChar* p_string); MxBool StringEndsOnYOrN(const LegoChar* p_string);
@ -116,7 +123,7 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
private: private:
void Beta10Inline0x100733d0(); void Beta10Inline0x100733d0();
MxU16 m_unk0xbc; // 0xbc MxU16 m_shelfState; // 0xbc
// variable name verified by BETA10 0x1007184f // variable name verified by BETA10 0x1007184f
MxS16 m_numberOfParts; // 0xbe MxS16 m_numberOfParts; // 0xbe
@ -124,21 +131,21 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter {
// name derived from LegoVehicleBuildState, field 0x4f // name derived from LegoVehicleBuildState, field 0x4f
MxS16 m_placedPartCount; // 0xc0 MxS16 m_placedPartCount; // 0xc0
LegoAnimNodeData* m_unk0xc4; // 0xc4 LegoAnimNodeData* m_platformAnimNodeData; // 0xc4
LegoAnim m_unk0xc8; // 0xc8 LegoAnim m_platformAnim; // 0xc8
MxMatrix m_unk0xe0; // 0xe0 MxMatrix m_buildViewMatrix; // 0xe0
// variable name verified by BETA10 0x100719f0 // variable name verified by BETA10 0x100719f0
UnknownListEntry* m_parts; // 0x128 UnknownListEntry* m_parts; // 0x128
MxFloat m_unk0x12c; // 0x12c MxFloat m_shelfFrameBuffer; // 0x12c
MxFloat m_unk0x130; // 0x130 MxFloat m_shelfFrame; // 0x130
MxFloat m_unk0x134; // 0x134 MxFloat m_shelfFrameMax; // 0x134
MxFloat m_unk0x138; // 0x138 MxFloat m_shelfFrameInterval; // 0x138
MxULong m_unk0x13c; // 0x13c MxULong m_unk0x13c; // 0x13c
LegoEntity* m_unk0x140; // 0x140 LegoEntity* m_carBuildEntity; // 0x140
MxS32 m_unk0x144; // 0x144 MxS32 m_unk0x144; // 0x144
MxS32 m_unk0x148; // 0x148 MxS32 m_unk0x148; // 0x148
// name verified by BETA10 0x10070d63 // name verified by BETA10 0x10070d63
LegoChar* m_mainSourceId; // 0x14c LegoChar* m_mainSourceId; // 0x14c

View File

@ -76,7 +76,7 @@ class LegoCharacterManager {
void ReleaseActor(const char* p_name); void ReleaseActor(const char* p_name);
void ReleaseActor(LegoROI* p_roi); void ReleaseActor(LegoROI* p_roi);
void ReleaseAutoROI(LegoROI* p_roi); void ReleaseAutoROI(LegoROI* p_roi);
MxBool FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_texture); MxBool SetHeadTexture(LegoROI* p_roi, LegoTextureInfo* p_texture);
LegoExtraActor* GetExtraActor(const char* p_name); LegoExtraActor* GetExtraActor(const char* p_name);
LegoActorInfo* GetActorInfo(const char* p_name); LegoActorInfo* GetActorInfo(const char* p_name);
LegoActorInfo* GetActorInfo(LegoROI* p_roi); LegoActorInfo* GetActorInfo(LegoROI* p_roi);
@ -86,10 +86,10 @@ class LegoCharacterManager {
MxBool SwitchMove(LegoROI* p_roi); MxBool SwitchMove(LegoROI* p_roi);
MxBool SwitchMood(LegoROI* p_roi); MxBool SwitchMood(LegoROI* p_roi);
MxU32 GetAnimationId(LegoROI* p_roi); MxU32 GetAnimationId(LegoROI* p_roi);
MxU32 GetSoundId(LegoROI* p_roi, MxBool p_und); MxU32 GetSoundId(LegoROI* p_roi, MxBool p_basedOnMood);
MxU8 GetMood(LegoROI* p_roi); MxU8 GetMood(LegoROI* p_roi);
LegoROI* CreateAutoROI(const char* p_name, const char* p_lodName, MxBool p_createEntity); LegoROI* CreateAutoROI(const char* p_name, const char* p_lodName, MxBool p_createEntity);
MxResult FUN_10085870(LegoROI* p_roi); MxResult UpdateBoundingSphereAndBox(LegoROI* p_roi);
LegoROI* FUN_10085a80(const char* p_name, const char* p_lodName, MxBool p_createEntity); LegoROI* FUN_10085a80(const char* p_name, const char* p_lodName, MxBool p_createEntity);
static const char* GetCustomizeAnimFile() { return g_customizeAnimFile; } static const char* GetCustomizeAnimFile() { return g_customizeAnimFile; }

View File

@ -66,27 +66,33 @@ class LegoControlManager : public MxCore {
return !strcmp(p_name, LegoControlManager::ClassName()) || MxCore::IsA(p_name); return !strcmp(p_name, LegoControlManager::ClassName()) || MxCore::IsA(p_name);
} }
void FUN_10028df0(MxPresenterList* p_presenterList); void SetPresenterList(MxPresenterList* p_presenterList);
void Register(MxCore* p_listener); void Register(MxCore* p_listener);
void Unregister(MxCore* p_listener); void Unregister(MxCore* p_listener);
MxBool FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter); MxBool HandleButtonDown(LegoEventNotificationParam& p_param, MxPresenter* p_presenter);
void FUN_100293c0(MxU32 p_objectId, const char* p_atom, MxS16 p_unk0x4e); void UpdateEnabledChild(MxU32 p_objectId, const char* p_atom, MxS16 p_enabledChild);
MxControlPresenter* FUN_100294e0(MxS32 p_x, MxS32 p_y); MxControlPresenter* GetControlAt(MxS32 p_x, MxS32 p_y);
MxBool FUN_10029630(); MxBool HandleButtonDown();
MxBool FUN_10029750(); MxBool HandleButtonUp();
void FUN_100292e0(); void Notify();
undefined4 GetUnknown0x0c() { return m_unk0x0c; } MxU32 HandleUpNextTickle() { return m_handleUpNextTickle; }
undefined GetUnknown0x10() { return m_unk0x10; } MxBool IsSecondButtonDown() { return m_secondButtonDown; }
// SYNTHETIC: LEGO1 0x10028d40 // SYNTHETIC: LEGO1 0x10028d40
// LegoControlManager::`scalar deleting destructor' // LegoControlManager::`scalar deleting destructor'
private: private:
undefined4 m_unk0x08; // 0x08 enum {
undefined4 m_unk0x0c; // 0x0c e_idle = 0,
MxBool m_unk0x10; // 0x10 e_waitNextTickle = 1,
MxPresenter* m_unk0x14; // 0x14 e_tickled = 2,
};
MxU32 m_buttonDownState; // 0x08
MxU32 m_handleUpNextTickle; // 0x0c
MxBool m_secondButtonDown; // 0x10
MxPresenter* m_handledPresenter; // 0x14
LegoControlManagerNotificationParam m_event; // 0x18 LegoControlManagerNotificationParam m_event; // 0x18
MxPresenterList* m_presenterList; // 0x44 MxPresenterList* m_presenterList; // 0x44
LegoNotifyList m_notifyList; // 0x48 LegoNotifyList m_notifyList; // 0x48

View File

@ -28,7 +28,7 @@ class LegoEntity : public MxEntity {
}; };
enum { enum {
c_altBit1 = 0x01 c_disabled = 0x01
}; };
LegoEntity() { Init(); } LegoEntity() { Init(); }
@ -68,13 +68,13 @@ class LegoEntity : public MxEntity {
// FUNCTION: BETA10 0x10013260 // FUNCTION: BETA10 0x10013260
virtual void SetWorldSpeed(MxFloat p_worldSpeed) { m_worldSpeed = p_worldSpeed; } // vtable+0x30 virtual void SetWorldSpeed(MxFloat p_worldSpeed) { m_worldSpeed = p_worldSpeed; } // vtable+0x30
virtual void ClickSound(MxBool p_und); // vtable+0x34 virtual void ClickSound(MxBool p_basedOnMood); // vtable+0x34
virtual void ClickAnimation(); // vtable+0x38 virtual void ClickAnimation(); // vtable+0x38
virtual void SwitchVariant(); // vtable+0x3c virtual void SwitchVariant(); // vtable+0x3c
virtual void SwitchSound(); // vtable+0x40 virtual void SwitchSound(); // vtable+0x40
virtual void SwitchMove(); // vtable+0x44 virtual void SwitchMove(); // vtable+0x44
virtual void SwitchColor(LegoROI* p_roi); // vtable+0x48 virtual void SwitchColor(LegoROI* p_roi); // vtable+0x48
virtual void SwitchMood(); // vtable+0x4c virtual void SwitchMood(); // vtable+0x4c
void FUN_10010c30(); void FUN_10010c30();
void SetType(MxU8 p_type); void SetType(MxU8 p_type);
@ -83,7 +83,7 @@ class LegoEntity : public MxEntity {
Mx3DPointFloat GetWorldUp(); Mx3DPointFloat GetWorldUp();
Mx3DPointFloat GetWorldPosition(); Mx3DPointFloat GetWorldPosition();
MxBool GetUnknown0x10IsSet(MxU8 p_flag) { return m_unk0x10 & p_flag; } MxBool IsInteraction(MxU8 p_flag) { return m_interaction & p_flag; }
MxBool GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; } MxBool GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; }
MxU8 GetFlags() { return m_flags; } MxU8 GetFlags() { return m_flags; }
@ -101,14 +101,14 @@ class LegoEntity : public MxEntity {
void SetFlags(MxU8 p_flags) { m_flags = p_flags; } void SetFlags(MxU8 p_flags) { m_flags = p_flags; }
void SetFlag(MxU8 p_flag) { m_flags |= p_flag; } void SetFlag(MxU8 p_flag) { m_flags |= p_flag; }
void ClearFlag(MxU8 p_flag) { m_flags &= ~p_flag; } void ClearFlag(MxU8 p_flag) { m_flags &= ~p_flag; }
void SetUnknown0x10Flag(MxU8 p_flag) { m_unk0x10 |= p_flag; } void SetInteractionFlag(MxU8 p_flag) { m_interaction |= p_flag; }
void ClearUnknown0x10Flag(MxU8 p_flag) { m_unk0x10 &= ~p_flag; } void ClearInteractionFlag(MxU8 p_flag) { m_interaction &= ~p_flag; }
protected: protected:
void Init(); void Init();
void SetWorld(); void SetWorld();
MxU8 m_unk0x10; // 0x10 MxU8 m_interaction; // 0x10
MxU8 m_flags; // 0x11 MxU8 m_flags; // 0x11
Mx3DPointFloat m_worldLocation; // 0x14 Mx3DPointFloat m_worldLocation; // 0x14
Mx3DPointFloat m_worldDirection; // 0x28 Mx3DPointFloat m_worldDirection; // 0x28

View File

@ -67,7 +67,7 @@ class LegoGameState {
e_isle, e_isle,
e_infomain, e_infomain,
e_infodoor, e_infodoor,
e_unk4, e_infocenterExited,
e_elevbott, e_elevbott,
e_elevride, e_elevride,
e_elevride2, e_elevride2,
@ -80,10 +80,10 @@ class LegoGameState {
e_jetrace, e_jetrace,
e_jetrace2, e_jetrace2,
e_jetraceExterior, e_jetraceExterior,
e_unk17, e_jetskibuildExited,
e_carrace, e_carrace,
e_carraceExterior, e_carraceExterior,
e_unk20, e_racecarbuildExited,
e_unk21, e_unk21,
e_pizzeriaExterior, e_pizzeriaExterior,
e_unk23, e_unk23,
@ -91,12 +91,12 @@ class LegoGameState {
e_garageExterior, e_garageExterior,
e_garage, e_garage,
e_garadoor, e_garadoor,
e_unk28, e_garageExited,
e_hospitalExterior, e_hospitalExterior,
e_hospital, e_hospital,
e_unk31, e_hospitalExited,
e_policeExterior, e_policeExterior,
e_unk33, e_policeExited,
e_police, e_police,
e_polidoor, e_polidoor,
e_copterbuild, e_copterbuild,
@ -129,7 +129,7 @@ class LegoGameState {
e_towtrack, e_towtrack,
e_jetski, e_jetski,
e_unk66 = 66 e_vehicleExited = 66
}; };
// SIZE 0x0e // SIZE 0x0e
@ -150,7 +150,18 @@ class LegoGameState {
MxS16 m_totalScore; // 0x00 MxS16 m_totalScore; // 0x00
MxU8 m_scores[5][5]; // 0x02 MxU8 m_scores[5][5]; // 0x02
Username m_name; // 0x1c Username m_name; // 0x1c
MxS16 m_unk0x2a; // 0x2a MxS16 m_playerId; // 0x2a
ScoreItem& operator=(const ScoreItem& p_other)
{
// MSVC auto-generates an operator=, but LegoGameState::WriteScoreHistory() has a much better match
// with a manual implementation.
m_totalScore = p_other.m_totalScore;
memcpy(m_scores, p_other.m_scores, sizeof(m_scores));
m_name = p_other.m_name;
m_playerId = p_other.m_playerId;
return *this;
}
}; };
// SIZE 0x372 // SIZE 0x372
@ -158,7 +169,7 @@ class LegoGameState {
History(); History();
void WriteScoreHistory(); void WriteScoreHistory();
MxResult Serialize(LegoStorage* p_storage); MxResult Serialize(LegoStorage* p_storage);
ScoreItem* FUN_1003cc90(Username* p_player, MxS16 p_unk0x24, MxS32& p_unk0x2c); ScoreItem* FindPlayerInScoreHistory(Username* p_player, MxS16 p_unk0x24, MxS32& p_unk0x2c);
// FUNCTION: BETA10 0x1002c2b0 // FUNCTION: BETA10 0x1002c2b0
MxS16 GetCount() { return m_count; } MxS16 GetCount() { return m_count; }
@ -167,9 +178,12 @@ class LegoGameState {
// FUNCTION: BETA10 0x1002c540 // FUNCTION: BETA10 0x1002c540
ScoreItem* GetScore(MxS32 p_index) { return p_index >= m_count ? NULL : &m_scores[p_index]; } ScoreItem* GetScore(MxS32 p_index) { return p_index >= m_count ? NULL : &m_scores[p_index]; }
MxS16 m_count; // 0x00 MxS16 m_count; // 0x00
ScoreItem m_scores[20]; // 0x02 #ifdef BETA10
MxS16 m_unk0x372; // 0x372 MxS16 m_indices[20]; // 0x02
#endif
ScoreItem m_scores[20]; // 0x02 (0x22 for BETA10)
MxS16 m_nextPlayerId; // 0x372 (0x392 for BETA10)
}; };
LegoGameState(); LegoGameState();
@ -209,14 +223,8 @@ class LegoGameState {
Act GetCurrentAct() { return m_currentAct; } Act GetCurrentAct() { return m_currentAct; }
Act GetLoadedAct() { return m_loadedAct; } Act GetLoadedAct() { return m_loadedAct; }
Area GetPreviousArea() { return m_previousArea; }
Area GetUnknown0x42c() { return m_unk0x42c; }
void SetDirty(MxBool p_isDirty) { m_isDirty = p_isDirty; }
void SetPreviousArea(Area p_previousArea) { m_previousArea = p_previousArea; }
void SetActorId(MxU8 p_actorId) { m_actorId = p_actorId; } void SetActorId(MxU8 p_actorId) { m_actorId = p_actorId; }
Username* GetPlayersIndex(MxS32 p_index) { return &m_players[p_index]; }
MxS16 GetPlayerCount() { return m_playerCount; }
LegoBackgroundColor* GetBackgroundColor() { return m_backgroundColor; } LegoBackgroundColor* GetBackgroundColor() { return m_backgroundColor; }
void SetCurrentAct(Act p_currentAct); void SetCurrentAct(Act p_currentAct);
@ -228,7 +236,7 @@ class LegoGameState {
MxResult WriteEndOfVariables(LegoStorage* p_storage); MxResult WriteEndOfVariables(LegoStorage* p_storage);
MxS32 ReadVariable(LegoStorage* p_storage, MxVariableTable* p_to); MxS32 ReadVariable(LegoStorage* p_storage, MxVariableTable* p_to);
void SetColors(); void SetColors();
void SetROIHandlerFunction(); void SetROIColorOverride();
char* m_savePath; // 0x00 char* m_savePath; // 0x00
MxS16 m_stateCount; // 0x04 MxS16 m_stateCount; // 0x04
@ -240,14 +248,11 @@ class LegoGameState {
LegoBackgroundColor* m_tempBackgroundColor; // 0x1c LegoBackgroundColor* m_tempBackgroundColor; // 0x1c
LegoFullScreenMovie* m_fullScreenMovie; // 0x20 LegoFullScreenMovie* m_fullScreenMovie; // 0x20
// TODO: Most likely getters/setters are not used according to BETA for the following members:
public: public:
MxS16 m_unk0x24; // 0x24 MxS16 m_currentPlayerId; // 0x24
MxS16 m_playerCount; // 0x26 MxS16 m_playerCount; // 0x26
Username m_players[9]; // 0x28 Username m_players[9]; // 0x28
History m_history; // 0xa6 History m_history; // 0xa6
undefined2 m_unk0x41a; // 0x41a
JukeboxScript::Script m_jukeboxMusic; // 0x41c JukeboxScript::Script m_jukeboxMusic; // 0x41c
MxBool m_isDirty; // 0x420 MxBool m_isDirty; // 0x420
Area m_currentArea; // 0x424 Area m_currentArea; // 0x424
@ -255,7 +260,7 @@ class LegoGameState {
Area m_unk0x42c; // 0x42c Area m_unk0x42c; // 0x42c
}; };
MxBool ROIHandlerFunction(const char* p_input, char* p_output, MxU32 p_copyLen); MxBool ROIColorOverride(const char* p_input, char* p_output, MxU32 p_copyLen);
// SYNTHETIC: LEGO1 0x1003c860 // SYNTHETIC: LEGO1 0x1003c860
// LegoGameState::ScoreItem::ScoreItem // LegoGameState::ScoreItem::ScoreItem

View File

@ -13,8 +13,8 @@ class LegoCameraController;
class LegoControlManager; class LegoControlManager;
class LegoWorld; class LegoWorld;
extern MxS32 g_unk0x100f31b0; extern MxS32 g_clickedObjectId;
extern const char* g_unk0x100f31b4; extern const char* g_clickedAtom;
// VTABLE: LEGO1 0x100d87b8 // VTABLE: LEGO1 0x100d87b8
// class MxCollection<LegoEventNotificationParam> // class MxCollection<LegoEventNotificationParam>
@ -74,7 +74,7 @@ class LegoInputManager : public MxPresenter {
c_right = 0x02, c_right = 0x02,
c_up = 0x04, c_up = 0x04,
c_down = 0x08, c_down = 0x08,
c_bit5 = 0x10, c_ctrl = 0x10,
c_leftOrRight = c_left | c_right, c_leftOrRight = c_left | c_right,
c_upOrDown = c_up | c_down c_upOrDown = c_up | c_down

View File

@ -90,9 +90,6 @@ class LegoOmni : public MxOmni {
return *this; return *this;
} }
World GetId() { return m_id; }
const char* GetKey() { return m_key; }
World m_id; // 0x00 World m_id; // 0x00
char m_key[20]; // 0x04 char m_key[20]; // 0x04
MxAtomId* m_atomId; // 0x18 MxAtomId* m_atomId; // 0x18
@ -186,7 +183,7 @@ class LegoOmni : public MxOmni {
MxResult StartActionIfUnknown0x13c(MxDSAction& p_dsAction) { return m_unk0x13c ? Start(&p_dsAction) : SUCCESS; } MxResult StartActionIfUnknown0x13c(MxDSAction& p_dsAction) { return m_unk0x13c ? Start(&p_dsAction) : SUCCESS; }
void SetUnknown13c(MxBool p_unk0x13c) { m_unk0x13c = p_unk0x13c; } void SetUnknown13c(MxBool p_unk0x13c) { m_unk0x13c = p_unk0x13c; }
void CloseMainWindow() { PostMessageA(m_windowHandle, WM_CLOSE, 0, 0); } void CloseMainWindow() { PostMessage(m_windowHandle, WM_CLOSE, 0, 0); }
// SYNTHETIC: LEGO1 0x10058b30 // SYNTHETIC: LEGO1 0x10058b30
// LegoOmni::`scalar deleting destructor' // LegoOmni::`scalar deleting destructor'

View File

@ -46,7 +46,7 @@ class LegoModelPresenter : public MxVideoPresenter {
void ReadyTickle() override; // vtable+0x18 void ReadyTickle() override; // vtable+0x18
void ParseExtra() override; // vtable+0x30 void ParseExtra() override; // vtable+0x30
MxResult FUN_1007ff70(MxDSChunk& p_chunk, LegoEntity* p_entity, MxBool p_roiVisible, LegoWorld* p_world); MxResult CreateROI(MxDSChunk& p_chunk, LegoEntity* p_entity, MxBool p_roiVisible, LegoWorld* p_world);
void Reset() void Reset()
{ {

View File

@ -155,7 +155,7 @@ class LegoNavController : public MxCore {
float m_unk0x60; // 0x60 float m_unk0x60; // 0x60
float m_unk0x64; // 0x64 float m_unk0x64; // 0x64
float m_unk0x68; // 0x68 float m_unk0x68; // 0x68
MxBool m_unk0x6c; // 0x6c MxBool m_isAccelerating; // 0x6c
// one copy of defaults (these can be set by App.) // one copy of defaults (these can be set by App.)
static int g_defdeadZone; static int g_defdeadZone;

View File

@ -10,10 +10,10 @@ struct LegoNamedPlane;
class LegoPathBoundary; class LegoPathBoundary;
class LegoPathController; class LegoPathController;
struct LegoPathEdgeContainer; struct LegoPathEdgeContainer;
struct LegoUnknown100db7f4; struct LegoOrientedEdge;
class LegoWEEdge; class LegoWEEdge;
extern MxLong g_unk0x100f3308; extern MxLong g_timeLastHitSoundPlayed;
extern const char* g_strHIT_WALL_SOUND; extern const char* g_strHIT_WALL_SOUND;
// VTABLE: LEGO1 0x100d6e28 // VTABLE: LEGO1 0x100d6e28
@ -51,9 +51,11 @@ class LegoPathActor : public LegoActor {
virtual void VTable0x74(Matrix4& p_transform); // vtable+0x74 virtual void VTable0x74(Matrix4& p_transform); // vtable+0x74
// FUNCTION: LEGO1 0x10002d20 // FUNCTION: LEGO1 0x10002d20
// FUNCTION: BETA10 0x1000f500
virtual void SetUserNavFlag(MxBool p_userNavFlag) { m_userNavFlag = p_userNavFlag; } // vtable+0x78 virtual void SetUserNavFlag(MxBool p_userNavFlag) { m_userNavFlag = p_userNavFlag; } // vtable+0x78
// FUNCTION: LEGO1 0x10002d30 // FUNCTION: LEGO1 0x10002d30
// FUNCTION: BETA10 0x1000f530
virtual MxBool GetUserNavFlag() { return m_userNavFlag; } // vtable+0x7c virtual MxBool GetUserNavFlag() { return m_userNavFlag; } // vtable+0x7c
virtual MxResult VTable0x80( virtual MxResult VTable0x80(
@ -67,7 +69,7 @@ class LegoPathActor : public LegoActor {
float p_time, float p_time,
Vector3& p_p1, Vector3& p_p1,
Vector3& p_p4, Vector3& p_p4,
LegoUnknown100db7f4& p_destEdge, LegoOrientedEdge* p_destEdge,
float p_destScale float p_destScale
); // vtable+0x84 ); // vtable+0x84
virtual MxResult VTable0x88( virtual MxResult VTable0x88(
@ -75,49 +77,59 @@ class LegoPathActor : public LegoActor {
float p_time, float p_time,
LegoEdge& p_srcEdge, LegoEdge& p_srcEdge,
float p_srcScale, float p_srcScale,
LegoUnknown100db7f4& p_destEdge, LegoOrientedEdge& p_destEdge,
float p_destScale float p_destScale
); // vtable+0x88 ); // vtable+0x88
virtual MxS32 VTable0x8c(float p_time, Matrix4& p_transform); // vtable+0x8c virtual MxS32 VTable0x8c(float p_time, Matrix4& p_transform); // vtable+0x8c
// FUNCTION: LEGO1 0x10002d40 // FUNCTION: LEGO1 0x10002d40
// FUNCTION: BETA10 0x1000f560
virtual MxU32 VTable0x90(float, Matrix4&) { return FALSE; } // vtable+0x90 virtual MxU32 VTable0x90(float, Matrix4&) { return FALSE; } // vtable+0x90
// FUNCTION: LEGO1 0x10002d50 // FUNCTION: LEGO1 0x10002d50
// FUNCTION: BETA10 0x1000f800
virtual MxResult HitActor(LegoPathActor*, MxBool) { return 0; } // vtable+0x94 virtual MxResult HitActor(LegoPathActor*, MxBool) { return 0; } // vtable+0x94
virtual void SwitchBoundary( virtual void SwitchBoundary(
LegoPathBoundary*& p_boundary, LegoPathBoundary*& p_boundary,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
float& p_unk0xe4 float& p_unk0xe4
); // vtable+0x98 ); // vtable+0x98
virtual MxResult VTable0x9c(); // vtable+0x9c virtual MxResult VTable0x9c(); // vtable+0x9c
// FUNCTION: LEGO1 0x10002d60 // FUNCTION: LEGO1 0x10002d60
// FUNCTION: BETA10 0x1000f820
virtual MxS32 VTable0xa0() { return 0; } // vtable+0xa0 virtual MxS32 VTable0xa0() { return 0; } // vtable+0xa0
virtual void VTable0xa4(MxBool& p_und1, MxS32& p_und2); // vtable+0xa4 virtual void VTable0xa4(MxBool& p_und1, MxS32& p_und2); // vtable+0xa4
virtual void VTable0xa8(); // vtable+0xa8 virtual void VTable0xa8(); // vtable+0xa8
// FUNCTION: LEGO1 0x10002d70 // FUNCTION: LEGO1 0x10002d70
// FUNCTION: BETA10 0x1000f580
virtual void SetMaxLinearVel(MxFloat p_maxLinearVel) { m_maxLinearVel = p_maxLinearVel; } // vtable+0xac virtual void SetMaxLinearVel(MxFloat p_maxLinearVel) { m_maxLinearVel = p_maxLinearVel; } // vtable+0xac
// FUNCTION: LEGO1 0x10002d80 // FUNCTION: LEGO1 0x10002d80
// FUNCTION: BETA10 0x1000f5b0
virtual MxFloat GetMaxLinearVel() { return m_maxLinearVel; } // vtable+0xb0 virtual MxFloat GetMaxLinearVel() { return m_maxLinearVel; } // vtable+0xb0
// FUNCTION: LEGO1 0x10002d90 // FUNCTION: LEGO1 0x10002d90
// FUNCTION: BETA10 0x1000f5e0
virtual MxFloat VTable0xb4() { return m_unk0x140; } // vtable+0xb4 virtual MxFloat VTable0xb4() { return m_unk0x140; } // vtable+0xb4
// FUNCTION: LEGO1 0x10002da0 // FUNCTION: LEGO1 0x10002da0
// FUNCTION: BETA10 0x1000f610
virtual MxFloat VTable0xb8() { return m_unk0x144; } // vtable+0xb8 virtual MxFloat VTable0xb8() { return m_unk0x144; } // vtable+0xb8
// FUNCTION: LEGO1 0x10002db0 // FUNCTION: LEGO1 0x10002db0
// FUNCTION: BETA10 0x1000f640
virtual void VTable0xbc(MxFloat p_unk0x140) { m_unk0x140 = p_unk0x140; } // vtable+0xbc virtual void VTable0xbc(MxFloat p_unk0x140) { m_unk0x140 = p_unk0x140; } // vtable+0xbc
// FUNCTION: LEGO1 0x10002dc0 // FUNCTION: LEGO1 0x10002dc0
// FUNCTION: BETA10 0x1000f670
virtual void VTable0xc0(MxFloat p_unk0x144) { m_unk0x144 = p_unk0x144; } // vtable+0xc0 virtual void VTable0xc0(MxFloat p_unk0x144) { m_unk0x144 = p_unk0x144; } // vtable+0xc0
// FUNCTION: LEGO1 0x10002dd0 // FUNCTION: LEGO1 0x10002dd0
// FUNCTION: BETA10 0x1000f6a0
virtual void VTable0xc4() {} // vtable+0xc4 virtual void VTable0xc4() {} // vtable+0xc4
// FUNCTION: LEGO1 0x10002de0 // FUNCTION: LEGO1 0x10002de0
@ -132,6 +144,7 @@ class LegoPathActor : public LegoActor {
} }
// FUNCTION: LEGO1 0x1000c440 // FUNCTION: LEGO1 0x1000c440
// FUNCTION: BETA10 0x100124c0
MxBool IsA(const char* p_name) const override // vtable+0x10 MxBool IsA(const char* p_name) const override // vtable+0x10
{ {
return !strcmp(p_name, LegoPathActor::ClassName()) || LegoActor::IsA(p_name); return !strcmp(p_name, LegoPathActor::ClassName()) || LegoActor::IsA(p_name);
@ -161,6 +174,7 @@ class LegoPathActor : public LegoActor {
void PlaceActor(LegoNamedPlane& p_namedPlane); void PlaceActor(LegoNamedPlane& p_namedPlane);
// SYNTHETIC: LEGO1 0x1002d800 // SYNTHETIC: LEGO1 0x1002d800
// SYNTHETIC: BETA10 0x100b04d0
// LegoPathActor::`scalar deleting destructor' // LegoPathActor::`scalar deleting destructor'
protected: protected:
@ -182,7 +196,7 @@ class LegoPathActor : public LegoActor {
LegoPathBoundary* m_boundary; // 0x88 LegoPathBoundary* m_boundary; // 0x88
LegoUnknown m_unk0x8c; // 0x8c LegoUnknown m_unk0x8c; // 0x8c
MxU32 m_actorState; // 0xdc MxU32 m_actorState; // 0xdc
LegoUnknown100db7f4* m_destEdge; // 0xe0 LegoOrientedEdge* m_destEdge; // 0xe0
MxFloat m_unk0xe4; // 0xe4 MxFloat m_unk0xe4; // 0xe4
MxBool m_collideBox; // 0xe8 MxBool m_collideBox; // 0xe8
MxBool m_unk0xe9; // 0xe9 MxBool m_unk0xe9; // 0xe9

View File

@ -39,22 +39,16 @@ class LegoPathBoundary : public LegoWEGEdge {
MxResult AddActor(LegoPathActor* p_actor); MxResult AddActor(LegoPathActor* p_actor);
MxResult RemoveActor(LegoPathActor* p_actor); MxResult RemoveActor(LegoPathActor* p_actor);
void FUN_100575b0(Vector3& p_point1, Vector3& p_point2, LegoPathActor* p_actor); void CheckAndCallPathTriggers(Vector3& p_point1, Vector3& p_point2, LegoPathActor* p_actor);
void SwitchBoundary( void SwitchBoundary(
LegoPathActor* p_actor, LegoPathActor* p_actor,
LegoPathBoundary*& p_boundary, LegoPathBoundary*& p_boundary,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
float& p_unk0xe4 float& p_unk0xe4
); );
MxU32 Intersect( MxU32 Intersect(float p_scale, Vector3& p_point1, Vector3& p_point2, Vector3& p_point3, LegoOrientedEdge*& p_edge);
float p_scale, MxU32 AddPresenterIfInRange(LegoAnimPresenter* p_presenter);
Vector3& p_point1, MxU32 RemovePresenter(LegoAnimPresenter* p_presenter);
Vector3& p_point2,
Vector3& p_point3,
LegoUnknown100db7f4*& p_edge
);
MxU32 FUN_10057fe0(LegoAnimPresenter* p_presenter);
MxU32 FUN_100586e0(LegoAnimPresenter* p_presenter);
// FUNCTION: BETA10 0x1001ffb0 // FUNCTION: BETA10 0x1001ffb0
LegoPathActorSet& GetActors() { return m_actors; } LegoPathActorSet& GetActors() { return m_actors; }
@ -188,7 +182,7 @@ class LegoPathBoundary : public LegoWEGEdge {
// _Tree<LegoPathActor *,LegoPathActor *,set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::_Kfn,LegoPathActorSetCompare,allocator<LegoPathActor *> >::lower_bound // _Tree<LegoPathActor *,LegoPathActor *,set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::_Kfn,LegoPathActorSetCompare,allocator<LegoPathActor *> >::lower_bound
// TEMPLATE: BETA10 0x10082b90 // TEMPLATE: BETA10 0x10082b90
// _Tree<LegoAnimPresenter *,LegoAnimPresenter *,set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::_Kfn,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::const_iterator::operator++ // ??Econst_iterator@?$_Tree@PAVLegoAnimPresenter@@PAV1@U_Kfn@?$set@PAVLegoAnimPresenter@@ULegoAnimPresenterSetCompare@@V?$allocator@PAVLegoAnimPresenter@@@@@@ULegoAnimPresenterSetCompare@@V?$allocator@PAVLegoAnimPresenter@@@@@@QAE?AV01@H@Z
// TEMPLATE: BETA10 0x10082ee0 // TEMPLATE: BETA10 0x10082ee0
// set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::end // set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::end
@ -203,13 +197,13 @@ class LegoPathBoundary : public LegoWEGEdge {
// _Tree<LegoAnimPresenter *,LegoAnimPresenter *,set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::_Kfn,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::find // _Tree<LegoAnimPresenter *,LegoAnimPresenter *,set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::_Kfn,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::find
// TEMPLATE: BETA10 0x10021dc0 // TEMPLATE: BETA10 0x10021dc0
// Set<LegoPathActor *,LegoPathActorSetCompare>::Set<LegoPathActor *,LegoPathActorSetCompare> // ??0?$Set@PAVLegoPathActor@@ULegoPathActorSetCompare@@@@QAE@ABV0@@Z
// TEMPLATE: BETA10 0x100202d0 // TEMPLATE: BETA10 0x100202d0
// set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::begin // set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::begin
// TEMPLATE: BETA10 0x10020030 // TEMPLATE: BETA10 0x10020030
// _Tree<LegoPathActor *,LegoPathActor *,set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::_Kfn,LegoPathActorSetCompare,allocator<LegoPathActor *> >::const_iterator::operator++ // ??Econst_iterator@?$_Tree@PAVLegoPathActor@@PAV1@U_Kfn@?$set@PAVLegoPathActor@@ULegoPathActorSetCompare@@V?$allocator@PAVLegoPathActor@@@@@@ULegoPathActorSetCompare@@V?$allocator@PAVLegoPathActor@@@@@@QAE?AV01@H@Z
// TEMPLATE: BETA10 0x100203d0 // TEMPLATE: BETA10 0x100203d0
// set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::end // set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::end

View File

@ -2,7 +2,7 @@
#define LEGOPATHCONTROLLER_H #define LEGOPATHCONTROLLER_H
#include "decomp.h" #include "decomp.h"
#include "geom/legounkown100db7f4.h" #include "geom/legoorientededge.h"
#include "legopathactor.h" #include "legopathactor.h"
#include "legopathboundary.h" #include "legopathboundary.h"
#include "legopathstruct.h" #include "legopathstruct.h"
@ -21,7 +21,7 @@ class Vector3;
// VTABLE: LEGO1 0x100d7da8 // VTABLE: LEGO1 0x100d7da8
// SIZE 0x40 // SIZE 0x40
struct LegoPathCtrlEdge : public LegoUnknown100db7f4 {}; struct LegoPathCtrlEdge : public LegoOrientedEdge {};
struct LegoPathCtrlEdgeCompare { struct LegoPathCtrlEdgeCompare {
MxU32 operator()(const LegoPathCtrlEdge* p_lhs, const LegoPathCtrlEdge* p_rhs) const MxU32 operator()(const LegoPathCtrlEdge* p_lhs, const LegoPathCtrlEdge* p_rhs) const
@ -60,7 +60,7 @@ class LegoPathController : public MxCore {
} }
LegoPathController* m_controller; // 0x00 LegoPathController* m_controller; // 0x00
LegoUnknown100db7f4* m_edge; // 0x04 LegoOrientedEdge* m_edge; // 0x04
}; };
LegoPathController(); LegoPathController();
@ -105,7 +105,7 @@ class LegoPathController : public MxCore {
MxResult PlaceActor(LegoPathActor* p_actor); MxResult PlaceActor(LegoPathActor* p_actor);
MxResult RemoveActor(LegoPathActor* p_actor); MxResult RemoveActor(LegoPathActor* p_actor);
void FUN_100468f0(LegoAnimPresenter* p_presenter); void FUN_100468f0(LegoAnimPresenter* p_presenter);
void FUN_10046930(LegoAnimPresenter* p_presenter); void RemovePresenterFromBoundaries(LegoAnimPresenter* p_presenter);
MxResult FUN_10046b30(LegoPathBoundary*& p_boundaries, MxS32& p_numL); MxResult FUN_10046b30(LegoPathBoundary*& p_boundaries, MxS32& p_numL);
LegoPathBoundary* GetPathBoundary(const char* p_name); LegoPathBoundary* GetPathBoundary(const char* p_name);
void Enable(MxBool p_enable); void Enable(MxBool p_enable);
@ -126,7 +126,7 @@ class LegoPathController : public MxCore {
Vector3& p_v1, Vector3& p_v1,
Vector3& p_v2, Vector3& p_v2,
float p_f1, float p_f1,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
LegoPathBoundary*& p_boundary LegoPathBoundary*& p_boundary
); );
MxResult FUN_1004a380( MxResult FUN_1004a380(
@ -144,13 +144,13 @@ class LegoPathController : public MxCore {
static MxResult Reset(); static MxResult Reset();
// FUNCTION: BETA10 0x100cf580 // FUNCTION: BETA10 0x100cf580
static LegoUnknown100db7f4* GetControlEdgeA(MxS32 p_index) { return g_ctrlEdgesA[p_index].m_edge; } static LegoOrientedEdge* GetControlEdgeA(MxS32 p_index) { return g_ctrlEdgesA[p_index].m_edge; }
// FUNCTION: BETA10 0x100cf5b0 // FUNCTION: BETA10 0x100cf5b0
static LegoPathBoundary* GetControlBoundaryA(MxS32 p_index) { return g_ctrlBoundariesA[p_index].m_boundary; } static LegoPathBoundary* GetControlBoundaryA(MxS32 p_index) { return g_ctrlBoundariesA[p_index].m_boundary; }
// These two are an educated guess because BETA10 does not have the g_ctrl.*B globals // These two are an educated guess because BETA10 does not have the g_ctrl.*B globals
static LegoUnknown100db7f4* GetControlEdgeB(MxS32 p_index) { return g_ctrlEdgesB[p_index].m_edge; } static LegoOrientedEdge* GetControlEdgeB(MxS32 p_index) { return g_ctrlEdgesB[p_index].m_edge; }
static LegoPathBoundary* GetControlBoundaryB(MxS32 p_index) { return g_ctrlBoundariesB[p_index].m_boundary; } static LegoPathBoundary* GetControlBoundaryB(MxS32 p_index) { return g_ctrlBoundariesB[p_index].m_boundary; }
private: private:
@ -189,12 +189,12 @@ class LegoPathController : public MxCore {
LegoPathBoundary* m_boundaries; // 0x08 LegoPathBoundary* m_boundaries; // 0x08
LegoPathCtrlEdge* m_edges; // 0x0c LegoPathCtrlEdge* m_edges; // 0x0c
Mx3DPointFloat* m_unk0x10; // 0x10 Mx3DPointFloat* m_nodes; // 0x10
LegoPathStruct* m_structs; // 0x14 LegoPathStruct* m_structs; // 0x14
MxU16 m_numL; // 0x18 MxU16 m_numL; // 0x18 Number of boundaries
MxU16 m_numE; // 0x1a MxU16 m_numE; // 0x1a Number of edges
MxU16 m_numN; // 0x1c MxU16 m_numN; // 0x1c Number of nodes
MxU16 m_numT; // 0x1e MxU16 m_numT; // 0x1e Number of structs
LegoPathCtrlEdgeSet m_pfsE; // 0x20 LegoPathCtrlEdgeSet m_pfsE; // 0x20
LegoPathActorSet m_actors; // 0x30 LegoPathActorSet m_actors; // 0x30
@ -264,7 +264,7 @@ class LegoPathController : public MxCore {
// LegoPathCtrlEdge::~LegoPathCtrlEdge // LegoPathCtrlEdge::~LegoPathCtrlEdge
// SYNTHETIC: LEGO1 0x10047ae0 // SYNTHETIC: LEGO1 0x10047ae0
// LegoUnknown100db7f4::~LegoUnknown100db7f4 // LegoOrientedEdge::~LegoOrientedEdge
// TEMPLATE: LEGO1 0x10048f00 // TEMPLATE: LEGO1 0x10048f00
// list<LegoBoundaryEdge,allocator<LegoBoundaryEdge> >::begin // list<LegoBoundaryEdge,allocator<LegoBoundaryEdge> >::begin

View File

@ -10,32 +10,32 @@ class LegoTextureInfo;
// SIZE 0x20 // SIZE 0x20
class LegoPhoneme { class LegoPhoneme {
public: public:
LegoPhoneme(const char* p_name, undefined4 p_unk0x14) LegoPhoneme(const char* p_name, MxU32 p_count)
{ {
m_name = p_name; m_name = p_name;
m_name.ToUpperCase(); m_name.ToUpperCase();
Init(); Init();
m_unk0x14 = p_unk0x14; m_count = p_count;
} }
~LegoPhoneme(); ~LegoPhoneme();
virtual undefined4 VTable0x00(); // vtable+0x00 virtual MxU32 GetCount(); // vtable+0x00
virtual void VTable0x04(undefined4 p_unk0x14); // vtable+0x04 virtual void SetCount(MxU32 p_count); // vtable+0x04
virtual LegoTextureInfo* VTable0x08(); // vtable+0x08 virtual LegoTextureInfo* GetTextureInfo(); // vtable+0x08
virtual void VTable0x0c(LegoTextureInfo* p_unk0x18); // vtable+0x0c virtual void SetTextureInfo(LegoTextureInfo* p_textureInfo); // vtable+0x0c
virtual LegoTextureInfo* VTable0x10(); // vtable+0x10 virtual LegoTextureInfo* GetCachedTextureInfo(); // vtable+0x10
virtual void VTable0x14(LegoTextureInfo* p_unk0x1c); // vtable+0x14 virtual void SetCachedTextureInfo(LegoTextureInfo* p_cachedTextureInfo); // vtable+0x14
virtual void VTable0x18(); // vtable+0x18 virtual void VTable0x18(); // vtable+0x18
virtual void Init(); // vtable+0x1c virtual void Init(); // vtable+0x1c
virtual void VTable0x20(undefined4); // vtable+0x20 virtual void VTable0x20(undefined4); // vtable+0x20
MxString& GetName() { return m_name; } MxString& GetName() { return m_name; }
private: private:
MxString m_name; // 0x04 MxString m_name; // 0x04
undefined4 m_unk0x14; // 0x14 MxU32 m_count; // 0x14
LegoTextureInfo* m_unk0x18; // 0x18 LegoTextureInfo* m_textureInfo; // 0x18
LegoTextureInfo* m_unk0x1c; // 0x1c LegoTextureInfo* m_cachedTextureInfo; // 0x1c
}; };
#endif // LEGOPHONEME_H #endif // LEGOPHONEME_H

View File

@ -49,14 +49,14 @@ class LegoPlantManager : public MxCore {
MxBool SwitchMove(LegoEntity* p_entity); MxBool SwitchMove(LegoEntity* p_entity);
MxBool SwitchMood(LegoEntity* p_entity); MxBool SwitchMood(LegoEntity* p_entity);
MxU32 GetAnimationId(LegoEntity* p_entity); MxU32 GetAnimationId(LegoEntity* p_entity);
MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state); MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_basedOnMood);
LegoPlantInfo* GetInfoArray(MxS32& p_length); LegoPlantInfo* GetInfoArray(MxS32& p_length);
LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, LegoOmni::World p_worldId); LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, LegoOmni::World p_worldId);
MxBool FUN_10026c50(LegoEntity* p_entity); MxBool DecrementCounter(LegoEntity* p_entity);
void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length); void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length);
MxResult FUN_10026410(); MxResult DetermineBoundaries();
void FUN_10027120(); void ClearCounters();
void FUN_10027200(); void SetInitialCounters();
static void SetCustomizeAnimFile(const char* p_value); static void SetCustomizeAnimFile(const char* p_value);
@ -68,20 +68,20 @@ class LegoPlantManager : public MxCore {
private: private:
void RemovePlant(MxS32 p_index, LegoOmni::World p_worldId); void RemovePlant(MxS32 p_index, LegoOmni::World p_worldId);
void FUN_10026860(MxS32 p_index); void AdjustHeight(MxS32 p_index);
LegoPlantInfo* GetInfo(LegoEntity* p_entity); LegoPlantInfo* GetInfo(LegoEntity* p_entity);
MxBool FUN_10026c80(MxS32 p_index); MxBool DecrementCounter(MxS32 p_index);
void FUN_100271b0(LegoEntity* p_entity, MxS32 p_adjust); void AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust);
static char* g_customizeAnimFile; static char* g_customizeAnimFile;
static MxS32 g_maxMove[4]; static MxS32 g_maxMove[4];
static MxU32 g_maxSound; static MxU32 g_maxSound;
LegoOmni::World m_worldId; // 0x08 LegoOmni::World m_worldId; // 0x08
undefined m_unk0x0c; // 0x0c MxBool m_boundariesDetermined; // 0x0c
AnimEntry* m_entries[5]; // 0x10 AnimEntry* m_entries[5]; // 0x10
MxS8 m_numEntries; // 0x24 MxS8 m_numEntries; // 0x24
LegoWorld* m_world; // 0x28 LegoWorld* m_world; // 0x28
}; };
#endif // LEGOPLANTMANAGER_H #endif // LEGOPLANTMANAGER_H

View File

@ -41,8 +41,8 @@ struct LegoPlantInfo {
MxU32 m_move; // 0x10 MxU32 m_move; // 0x10
MxU8 m_mood; // 0x14 MxU8 m_mood; // 0x14
MxU8 m_color; // 0x15 - see enum for possible values MxU8 m_color; // 0x15 - see enum for possible values
MxS8 m_unk0x16; // 0x16 MxS8 m_counter; // 0x16
MxS8 m_initialUnk0x16; // 0x17 - initial value loaded to m_unk0x16 MxS8 m_initialCounter; // 0x17 - initial value loaded to m_counter
const char* m_name; // 0x18 const char* m_name; // 0x18
undefined4 m_unk0x1c; // 0x1c undefined4 m_unk0x1c; // 0x1c
float m_x; // 0x20 float m_x; // 0x20

View File

@ -11,7 +11,7 @@
#include "mxtypes.h" #include "mxtypes.h"
class Act1State; class Act1State;
class LegoEventNotificationParam; class LegoControlManagerNotificationParam;
class LegoPathActor; class LegoPathActor;
class MxEndActionNotificationParam; class MxEndActionNotificationParam;
class MxNotificationParam; class MxNotificationParam;
@ -117,7 +117,7 @@ class LegoRace : public LegoWorld {
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
virtual MxLong HandleClick(LegoEventNotificationParam&) = 0; // vtable+0x6c virtual MxLong HandleControl(LegoControlManagerNotificationParam&) = 0; // vtable+0x6c
// FUNCTION: LEGO1 0x10015b70 // FUNCTION: LEGO1 0x10015b70
virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x70 virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x70

View File

@ -72,7 +72,7 @@ class LegoJetski : public LegoJetskiRaceActor, public LegoRaceMap {
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
// FUNCTION: LEGO1 0x100141d0 // FUNCTION: LEGO1 0x100141d0
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4) override
{ {
LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4); LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
} // vtable+0x98 } // vtable+0x98
@ -136,7 +136,7 @@ class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
// FUNCTION: LEGO1 0x10014560 // FUNCTION: LEGO1 0x10014560
// FUNCTION: BETA10 0x100cd660 // FUNCTION: BETA10 0x100cd660
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4) override
{ {
LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4); LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
} // vtable+0x98 } // vtable+0x98
@ -144,10 +144,10 @@ class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
MxResult VTable0x9c() override; // vtable+0x9c MxResult VTable0x9c() override; // vtable+0x9c
virtual void SetMaxLinearVelocity(float p_maxLinearVelocity); virtual void SetMaxLinearVelocity(float p_maxLinearVelocity);
virtual void FUN_10012ff0(float p_param); virtual void KickCamera(float p_param);
virtual MxU32 HandleSkeletonKicks(float p_param1); virtual MxU32 HandleSkeletonKicks(float p_param1);
static void FUN_10012de0(); static void InitYouCantStopSound();
static void InitSoundIndices(); static void InitSoundIndices();
// SYNTHETIC: LEGO1 0x10014240 // SYNTHETIC: LEGO1 0x10014240
@ -155,7 +155,7 @@ class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
private: private:
undefined m_userState; // 0x54 undefined m_userState; // 0x54
float m_unk0x58; // 0x58 float m_kickStart; // 0x58
Mx3DPointFloat m_unk0x5c; // 0x5c Mx3DPointFloat m_unk0x5c; // 0x5c
// Names verified by BETA10 0x100cb4a9 // Names verified by BETA10 0x100cb4a9

View File

@ -44,8 +44,11 @@ class LegoCarRaceActor : public virtual LegoRaceActor {
Vector3& p_v3 Vector3& p_v3
) override; // vtable+0x6c ) override; // vtable+0x6c
void Animate(float p_time) override; // vtable+0x70 void Animate(float p_time) override; // vtable+0x70
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) void SwitchBoundary(
override; // vtable+0x98 LegoPathBoundary*& p_boundary,
LegoOrientedEdge*& p_edge,
float& p_unk0xe4
) override; // vtable+0x98
MxResult VTable0x9c() override; // vtable+0x9c MxResult VTable0x9c() override; // vtable+0x9c
// LegoCarRaceActor vtable // LegoCarRaceActor vtable
@ -83,7 +86,7 @@ class LegoCarRaceActor : public virtual LegoRaceActor {
protected: protected:
MxFloat m_unk0x08; // 0x08 MxFloat m_unk0x08; // 0x08
MxU8 m_unk0x0c; // 0x0c MxU8 m_animState; // 0x0c
// Could be a multiplier for the maximum speed when going straight // Could be a multiplier for the maximum speed when going straight
MxFloat m_unk0x10; // 0x10 MxFloat m_unk0x10; // 0x10

View File

@ -19,7 +19,7 @@ class LegoTextureInfo {
static BOOL SetGroupTexture(Tgl::Mesh* pMesh, LegoTextureInfo* p_textureInfo); static BOOL SetGroupTexture(Tgl::Mesh* pMesh, LegoTextureInfo* p_textureInfo);
static BOOL GetGroupTexture(Tgl::Mesh* pMesh, LegoTextureInfo*& p_textureInfo); static BOOL GetGroupTexture(Tgl::Mesh* pMesh, LegoTextureInfo*& p_textureInfo);
LegoResult FUN_10066010(const LegoU8* p_bits); LegoResult LoadBits(const LegoU8* p_bits);
// private: // private:
char* m_name; // 0x00 char* m_name; // 0x00

View File

@ -45,28 +45,28 @@ LegoROI* PickROI(MxLong p_x, MxLong p_y);
LegoROI* PickRootROI(MxLong p_x, MxLong p_y); LegoROI* PickRootROI(MxLong p_x, MxLong p_y);
void RotateY(LegoROI* p_roi, MxFloat p_angle); void RotateY(LegoROI* p_roi, MxFloat p_angle);
MxBool SpheresIntersect(const BoundingSphere& p_sphere1, const BoundingSphere& p_sphere2); MxBool SpheresIntersect(const BoundingSphere& p_sphere1, const BoundingSphere& p_sphere2);
MxBool FUN_1003ded0(MxFloat p_param1[2], MxFloat p_param2[3], MxFloat p_param3[3]); MxBool CalculateRayOriginDirection(MxFloat p_coordinates[2], MxFloat p_direction[3], MxFloat p_origin[3]);
MxBool TransformWorldToScreen(const MxFloat p_world[3], MxFloat p_screen[4]); MxBool TransformWorldToScreen(const MxFloat p_world[3], MxFloat p_screen[4]);
MxS16 CountTotalTreeNodes(LegoTreeNode* p_node); MxS16 CountTotalTreeNodes(LegoTreeNode* p_node);
LegoTreeNode* GetTreeNode(LegoTreeNode* p_node, MxU32 p_index); LegoTreeNode* GetTreeNode(LegoTreeNode* p_node, MxU32 p_index);
void FUN_1003e050(LegoAnimPresenter* p_presenter); void CalculateViewFromAnimation(LegoAnimPresenter* p_presenter);
Extra::ActionType MatchActionString(const char*); Extra::ActionType MatchActionString(const char*);
void InvokeAction(Extra::ActionType p_actionId, const MxAtomId& p_pAtom, MxS32 p_streamId, LegoEntity* p_sender); void InvokeAction(Extra::ActionType p_actionId, const MxAtomId& p_pAtom, MxS32 p_streamId, LegoEntity* p_sender);
void SetCameraControllerFromIsle(); void SetCameraControllerFromIsle();
void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut); void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut);
void PlayCamAnim(LegoPathActor* p_actor, MxBool p_unused, MxU32 p_location, MxBool p_bool); void PlayCamAnim(LegoPathActor* p_actor, MxBool p_unused, MxU32 p_location, MxBool p_bool);
void FUN_1003eda0(); void ResetViewVelocity();
MxBool RemoveFromCurrentWorld(const MxAtomId& p_atomId, MxS32 p_id); MxBool RemoveFromCurrentWorld(const MxAtomId& p_atomId, MxS32 p_id);
void EnableAnimations(MxBool p_enable); void EnableAnimations(MxBool p_enable);
void SetAppCursor(Cursor p_cursor); void SetAppCursor(Cursor p_cursor);
MxBool FUN_1003ef60(); MxBool CanExit();
MxBool RemoveFromWorld(MxAtomId& p_entityAtom, MxS32 p_entityId, MxAtomId& p_worldAtom, MxS32 p_worldEntityId); MxBool RemoveFromWorld(MxAtomId& p_entityAtom, MxS32 p_entityId, MxAtomId& p_worldAtom, MxS32 p_worldEntityId);
MxS32 UpdateLightPosition(MxS32 p_increase); MxS32 UpdateLightPosition(MxS32 p_increase);
void SetLightPosition(MxS32 p_index); void SetLightPosition(MxS32 p_index);
LegoNamedTexture* ReadNamedTexture(LegoStorage* p_storage); LegoNamedTexture* ReadNamedTexture(LegoStorage* p_storage);
void WriteDefaultTexture(LegoStorage* p_storage, const char* p_name); void WriteDefaultTexture(LegoStorage* p_storage, const char* p_name);
void WriteNamedTexture(LegoStorage* p_storage, LegoNamedTexture* p_namedTexture); void WriteNamedTexture(LegoStorage* p_storage, LegoNamedTexture* p_namedTexture);
void FUN_1003f930(LegoNamedTexture* p_namedTexture); void LoadFromNamedTexture(LegoNamedTexture* p_namedTexture);
// FUNCTION: BETA10 0x100260a0 // FUNCTION: BETA10 0x100260a0
inline void StartIsleAction(IsleScript::Script p_objectId) inline void StartIsleAction(IsleScript::Script p_objectId)

View File

@ -125,17 +125,17 @@ class LegoWorld : public LegoEntity {
// LegoWorld::`scalar deleting destructor' // LegoWorld::`scalar deleting destructor'
protected: protected:
LegoPathControllerList m_list0x68; // 0x68 LegoPathControllerList m_pathControllerList; // 0x68
MxPresenterList m_animPresenters; // 0x80 MxPresenterList m_animPresenters; // 0x80
LegoCameraController* m_cameraController; // 0x98 LegoCameraController* m_cameraController; // 0x98
LegoEntityList* m_entityList; // 0x9c LegoEntityList* m_entityList; // 0x9c
LegoCacheSoundList* m_cacheSoundList; // 0xa0 LegoCacheSoundList* m_cacheSoundList; // 0xa0
MxBool m_destroyed; // 0xa4 MxBool m_destroyed; // 0xa4
MxCoreSet m_set0xa8; // 0xa8 MxCoreSet m_set0xa8; // 0xa8
MxPresenterList m_controlPresenters; // 0xb8 MxPresenterList m_controlPresenters; // 0xb8
MxCoreSet m_set0xd0; // 0xd0 MxCoreSet m_set0xd0; // 0xd0
list<LegoROI*> m_roiList; // 0xe0 list<LegoROI*> m_roiList; // 0xe0
LegoOmni::World m_worldId; // 0xec LegoOmni::World m_worldId; // 0xec
// name verified by BETA10 0x100c7f59 // name verified by BETA10 0x100c7f59
LegoHideAnimPresenter* m_hideAnim; // 0xf0 LegoHideAnimPresenter* m_hideAnim; // 0xf0

View File

@ -50,10 +50,10 @@ class LegoWorldPresenter : public LegoEntityPresenter {
// LegoWorldPresenter::`scalar deleting destructor' // LegoWorldPresenter::`scalar deleting destructor'
private: private:
MxResult FUN_10067360(ModelDbPart& p_part, FILE* p_wdbFile); MxResult LoadWorldPart(ModelDbPart& p_part, FILE* p_wdbFile);
MxResult FUN_100674b0(ModelDbModel& p_model, FILE* p_wdbFile, LegoWorld* p_world); MxResult LoadWorldModel(ModelDbModel& p_model, FILE* p_wdbFile, LegoWorld* p_world);
undefined4 m_unk0x50; MxU32 m_nextObjectId;
}; };
#endif // LEGOWORLDPRESENTER_H #endif // LEGOWORLDPRESENTER_H

View File

@ -37,11 +37,11 @@ class MxBackgroundAudioManager : public MxCore {
void StartAction(MxParam& p_param); void StartAction(MxParam& p_param);
void StopAction(MxParam& p_param); void StopAction(MxParam& p_param);
MxResult PlayMusic(MxDSAction& p_action, undefined4 p_speed, MxPresenter::TickleState p_tickleState); MxResult PlayMusic(MxDSAction& p_action, MxS32 p_speed, MxPresenter::TickleState p_tickleState);
void FUN_1007ee70(); void MakePendingPresenterActive();
void FUN_1007ef40(); void FadeInPendingPresenter();
void FadeInOrFadeOut(); void FadeToTargetVolume();
void Enable(MxBool p_enable); void Enable(MxBool p_enable);
virtual MxResult Create(MxAtomId& p_script, MxU32 p_frequencyMS); virtual MxResult Create(MxAtomId& p_script, MxU32 p_frequencyMS);
@ -50,7 +50,7 @@ class MxBackgroundAudioManager : public MxCore {
void Stop(); void Stop();
void LowerVolume(); void LowerVolume();
void RaiseVolume(); void RaiseVolume();
undefined4 FUN_1007f610(MxPresenter* p_unk0x138, MxS32 p_speed, MxPresenter::TickleState p_tickleState); MxResult SetPendingPresenter(MxPresenter* p_presenter, MxS32 p_speed, MxPresenter::TickleState p_tickleState);
// SYNTHETIC: LEGO1 0x1007ec00 // SYNTHETIC: LEGO1 0x1007ec00
// MxBackgroundAudioManager::`scalar deleting destructor' // MxBackgroundAudioManager::`scalar deleting destructor'
@ -59,11 +59,11 @@ class MxBackgroundAudioManager : public MxCore {
MxResult OpenMusic(MxAtomId& p_script); MxResult OpenMusic(MxAtomId& p_script);
void DestroyMusic(); void DestroyMusic();
MxBool m_enabled; // 0x08 MxBool m_enabled; // 0x08
MxDSAction m_action1; // 0x0c MxDSAction m_action1; // 0x0c
MxAudioPresenter* m_unk0xa0; // 0xa0 MxAudioPresenter* m_activePresenter; // 0xa0
MxDSAction m_action2; // 0xa4 MxDSAction m_action2; // 0xa4
MxAudioPresenter* m_unk0x138; // 0x138 MxAudioPresenter* m_pendingPresenter; // 0x138
// name is inferred from context // name is inferred from context
MxPresenter::TickleState m_tickleState; // 0x13c MxPresenter::TickleState m_tickleState; // 0x13c
@ -71,9 +71,9 @@ class MxBackgroundAudioManager : public MxCore {
// name inferred from parameter p_speed // name inferred from parameter p_speed
MxS32 m_speed; // 0x140 MxS32 m_speed; // 0x140
MxS32 m_targetVolume; // 0x144 MxS32 m_targetVolume; // 0x144
MxS16 m_unk0x148; // 0x148 MxS16 m_volumeSuppressionAmount; // 0x148
MxAtomId m_script; // 0x14c MxAtomId m_script; // 0x14c
}; };
#endif // MXBACKGROUNDAUDIOMANAGER_H #endif // MXBACKGROUNDAUDIOMANAGER_H

View File

@ -44,21 +44,28 @@ class MxControlPresenter : public MxCompositePresenter {
void EndAction() override; // vtable+0x40 void EndAction() override; // vtable+0x40
MxBool HasTickleStatePassed(TickleState p_tickleState) override; // vtable+0x48 MxBool HasTickleStatePassed(TickleState p_tickleState) override; // vtable+0x48
void Enable(MxBool p_enable) override; // vtable+0x54 void Enable(MxBool p_enable) override; // vtable+0x54
virtual void VTable0x6c(MxS16 p_unk0x4e); // vtable+0x6c virtual void UpdateEnabledChild(MxS16 p_enabledChild); // vtable+0x6c
MxBool FUN_10044480(LegoControlManagerNotificationParam* p_param, MxPresenter* p_presenter); MxBool Notify(LegoControlManagerNotificationParam* p_param, MxPresenter* p_presenter);
MxBool FUN_10044270(MxS32 p_x, MxS32 p_y, MxPresenter* p_presenter); MxBool CheckButtonDown(MxS32 p_x, MxS32 p_y, MxPresenter* p_presenter);
MxS16 GetUnknown0x4e() { return m_unk0x4e; } MxS16 GetEnabledChild() { return m_enabledChild; }
private: private:
MxS16 m_unk0x4c; // 0x4c enum {
MxS16 m_unk0x4e; // 0x4e e_none,
MxBool m_unk0x50; // 0x50 e_toggle,
MxS16 m_unk0x52; // 0x52 e_grid,
MxS16 m_unk0x54; // 0x54 e_map,
MxS16 m_unk0x56; // 0x56 };
MxS16* m_states; // 0x58
MxS16 m_style; // 0x4c
MxS16 m_enabledChild; // 0x4e
MxBool m_unk0x50; // 0x50
MxS16 m_columnsOrRows; // 0x52
MxS16 m_rowsOrColumns; // 0x54
MxS16 m_stateOrCellIndex; // 0x56
MxS16* m_states; // 0x58
}; };
// SYNTHETIC: LEGO1 0x100440f0 // SYNTHETIC: LEGO1 0x100440f0

View File

@ -125,10 +125,10 @@ class PizzaMissionState : public LegoState {
MxResult Serialize(LegoStorage* p_storage) override; // vtable+0x1c MxResult Serialize(LegoStorage* p_storage) override; // vtable+0x1c
// FUNCTION: BETA10 0x100ef470 // FUNCTION: BETA10 0x100ef470
void SetUnknown0xb0(MxU32 p_unk0xb0) { m_unk0xb0 = p_unk0xb0; } void SetPlayedAction(MxU32 p_playedAction) { m_playedAction = p_playedAction; }
// FUNCTION: BETA10 0x100ef850 // FUNCTION: BETA10 0x100ef850
MxU32 GetUnknown0xb0() { return m_unk0xb0; } MxU32 GetPlayedAction() { return m_playedAction; }
// FUNCTION: BETA10 0x10088850 // FUNCTION: BETA10 0x10088850
MxS16 GetHighScore(MxU8 p_actorId) { return GetMission(p_actorId)->m_hiScore; } MxS16 GetHighScore(MxU8 p_actorId) { return GetMission(p_actorId)->m_hiScore; }
@ -137,12 +137,12 @@ class PizzaMissionState : public LegoState {
// PizzaMissionState::`scalar deleting destructor' // PizzaMissionState::`scalar deleting destructor'
Mission* GetMission(MxU8 p_actorId); Mission* GetMission(MxU8 p_actorId);
MxS16 FUN_10039540(); MxS16 GetActorState();
PizzeriaState* m_pizzeriaState; // 0x08 PizzeriaState* m_pizzeriaState; // 0x08
undefined4 m_unk0x0c; // 0x0c undefined4 m_unk0x0c; // 0x0c
Mission m_missions[5]; // 0x10 Mission m_missions[5]; // 0x10
MxU32 m_unk0xb0; // 0xb0 MxU32 m_playedAction; // 0xb0
static IsleScript::Script g_pepperActions[]; static IsleScript::Script g_pepperActions[];
static IsleScript::Script g_mamaActions[]; static IsleScript::Script g_mamaActions[];
@ -202,9 +202,9 @@ class Pizza : public IsleActor {
PizzaMissionState::Mission* m_mission; // 0x80 PizzaMissionState::Mission* m_mission; // 0x80
SkateBoard* m_skateBoard; // 0x84 SkateBoard* m_skateBoard; // 0x84
Act1State* m_act1state; // 0x88 Act1State* m_act1state; // 0x88
IsleScript::Script m_unk0x8c; // 0x8c IsleScript::Script m_speechAction; // 0x8c
MxLong m_unk0x90; // 0x90 MxLong m_startTime; // 0x90
MxLong m_unk0x94; // 0x94 MxLong m_duration; // 0x94
MxBool m_unk0x98; // 0x98 MxBool m_unk0x98; // 0x98
}; };

View File

@ -34,11 +34,11 @@ class PizzeriaState : public LegoState {
// SYNTHETIC: LEGO1 0x10017ce0 // SYNTHETIC: LEGO1 0x10017ce0
// PizzeriaState::`scalar deleting destructor' // PizzeriaState::`scalar deleting destructor'
MxS16 FUN_10017d50(); MxS16 GetActorState();
MxU32 NextAction(); MxU32 NextAction();
Playlist m_unk0x08[5]; // 0x08 Playlist m_playerPlaylists[5]; // 0x08
MxS32 m_unk0x44[5]; // 0x44 MxS32 m_states[5]; // 0x44
static IsleScript::Script g_pepperActions[]; static IsleScript::Script g_pepperActions[];
static IsleScript::Script g_mamaActions[]; static IsleScript::Script g_mamaActions[];

View File

@ -16,6 +16,11 @@ class MxDSAction;
// SIZE 0x10 // SIZE 0x10
class PoliceState : public LegoState { class PoliceState : public LegoState {
public: public:
enum {
e_noAnimation = 0,
e_playingAnimation = 1,
};
PoliceState(); PoliceState();
~PoliceState() override {} ~PoliceState() override {}
@ -38,15 +43,15 @@ class PoliceState : public LegoState {
// SYNTHETIC: LEGO1 0x1005e920 // SYNTHETIC: LEGO1 0x1005e920
// PoliceState::`scalar deleting destructor' // PoliceState::`scalar deleting destructor'
undefined4 GetUnknown0x0c() { return m_unk0x0c; } MxS32 GetState() { return m_state; }
void SetUnknown0x0c(undefined4 p_unk0x0c) { m_unk0x0c = p_unk0x0c; } void SetState(MxS32 p_state) { m_state = p_state; }
void FUN_1005ea40(); void StartAnimation();
// TODO: Most likely getters/setters are not used according to BETA. // TODO: Most likely getters/setters are not used according to BETA.
PoliceScript::Script m_policeScript; // 0x08 PoliceScript::Script m_policeScript; // 0x08
undefined4 m_unk0x0c; // 0x0c MxS32 m_state; // 0x0c
}; };
// VTABLE: LEGO1 0x100d8a80 // VTABLE: LEGO1 0x100d8a80

View File

@ -39,14 +39,14 @@ class RadioState : public LegoState {
void SetActive(MxBool p_active) { m_active = p_active; } void SetActive(MxBool p_active) { m_active = p_active; }
undefined4 FUN_1002d090(); MxU32 NextPlaylistObjectId();
MxBool FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId); MxBool IsRadioObjectId(const MxAtomId& p_atom, MxU32 p_objectId);
// TODO: Most likely getters/setters are not used according to BETA. // TODO: Most likely getters/setters are not used according to BETA.
Playlist m_unk0x08[3]; // 0x08 Playlist m_playlists[3]; // 0x08
MxS16 m_unk0x2c; // 0x2c MxS16 m_activePlaylist; // 0x2c
MxBool m_active; // 0x2e MxBool m_active; // 0x2e
}; };
// VTABLE: LEGO1 0x100d6d10 // VTABLE: LEGO1 0x100d6d10
@ -85,7 +85,7 @@ class Radio : public MxCore {
private: private:
RadioState* m_state; // 0x08 RadioState* m_state; // 0x08
MxBool m_unk0x0c; // 0x0c MxBool m_enabled; // 0x0c
MxBool m_audioEnabled; // 0x0d MxBool m_audioEnabled; // 0x0d
MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleEndAction(MxEndActionNotificationParam& p_param);

View File

@ -133,7 +133,6 @@ Act2Actor::Act2Actor()
} }
// FUNCTION: LEGO1 0x10018940 // FUNCTION: LEGO1 0x10018940
// FUNCTION: BETA10 0x1003d65f
void Act2Actor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) void Act2Actor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2)
{ {
LegoAnimActor::SetROI(p_roi, p_bool1, p_bool2); LegoAnimActor::SetROI(p_roi, p_bool1, p_bool2);
@ -417,7 +416,7 @@ void Act2Actor::FUN_100192a0(undefined4 p_location)
newPosition, newPosition,
newDirection, newDirection,
newBoundary, newBoundary,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
NULL NULL
); );
@ -611,8 +610,8 @@ MxU32 Act2Actor::FUN_10019700(MxFloat p_param)
MxMatrix matrix = m_roi->GetLocal2World(); MxMatrix matrix = m_roi->GetLocal2World();
matrix[3][1] += 1.0f; matrix[3][1] += 1.0f;
brickstrROI->FUN_100a58f0(matrix); brickstrROI->SetLocal2World(matrix);
brickstrROI->VTable0x14(); brickstrROI->WrappedUpdateWorldData();
Vector3 col0(matrix[0]); Vector3 col0(matrix[0]);
Vector3 col1(matrix[1]); Vector3 col1(matrix[1]);
@ -719,17 +718,17 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
switch (m_unk0x1d) { switch (m_unk0x1d) {
case 0: case 0:
if (buildingInfo[12].m_unk0x11) { if (buildingInfo[12].m_counter) {
result = buildingInfo[12].m_entity; result = buildingInfo[12].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else if (buildingInfo[14].m_unk0x11) { else if (buildingInfo[14].m_counter) {
result = buildingInfo[14].m_entity; result = buildingInfo[14].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f0f30[i] != -1; i++) { for (i = 0; g_unk0x100f0f30[i] != -1; i++) {
if (plantInfo[g_unk0x100f0f30[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0f30[i]].m_counter) {
result = plantInfo[g_unk0x100f0f30[i]].m_entity; result = plantInfo[g_unk0x100f0f30[i]].m_entity;
break; break;
} }
@ -737,13 +736,13 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
break; break;
case 1: case 1:
if (buildingInfo[13].m_unk0x11) { if (buildingInfo[13].m_counter) {
result = buildingInfo[13].m_entity; result = buildingInfo[13].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f0f50[i] != -1; i++) { for (i = 0; g_unk0x100f0f50[i] != -1; i++) {
if (plantInfo[g_unk0x100f0f50[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0f50[i]].m_counter) {
result = plantInfo[g_unk0x100f0f50[i]].m_entity; result = plantInfo[g_unk0x100f0f50[i]].m_entity;
break; break;
} }
@ -751,17 +750,17 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
break; break;
case 2: case 2:
if (buildingInfo[9].m_unk0x11) { if (buildingInfo[9].m_counter) {
result = buildingInfo[9].m_entity; result = buildingInfo[9].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else if (buildingInfo[11].m_unk0x11) { else if (buildingInfo[11].m_counter) {
result = buildingInfo[11].m_entity; result = buildingInfo[11].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f0f90[i] != -1; i++) { for (i = 0; g_unk0x100f0f90[i] != -1; i++) {
if (plantInfo[g_unk0x100f0f90[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0f90[i]].m_counter) {
result = plantInfo[g_unk0x100f0f90[i]].m_entity; result = plantInfo[g_unk0x100f0f90[i]].m_entity;
break; break;
} }
@ -769,21 +768,21 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
break; break;
case 3: case 3:
if (buildingInfo[7].m_unk0x11) { if (buildingInfo[7].m_counter) {
result = buildingInfo[7].m_entity; result = buildingInfo[7].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else if (buildingInfo[8].m_unk0x11) { else if (buildingInfo[8].m_counter) {
result = buildingInfo[8].m_entity; result = buildingInfo[8].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else if (buildingInfo[3].m_unk0x11) { else if (buildingInfo[3].m_counter) {
result = buildingInfo[3].m_entity; result = buildingInfo[3].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f0fa8[i] != -1; i++) { for (i = 0; g_unk0x100f0fa8[i] != -1; i++) {
if (plantInfo[g_unk0x100f0fa8[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0fa8[i]].m_counter) {
result = plantInfo[g_unk0x100f0fa8[i]].m_entity; result = plantInfo[g_unk0x100f0fa8[i]].m_entity;
break; break;
} }
@ -791,17 +790,17 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
break; break;
case 4: case 4:
if (buildingInfo[5].m_unk0x11) { if (buildingInfo[5].m_counter) {
result = buildingInfo[5].m_entity; result = buildingInfo[5].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else if (buildingInfo[10].m_unk0x11) { else if (buildingInfo[10].m_counter) {
result = buildingInfo[10].m_entity; result = buildingInfo[10].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f0fb8[i] != -1; i++) { for (i = 0; g_unk0x100f0fb8[i] != -1; i++) {
if (plantInfo[g_unk0x100f0fb8[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0fb8[i]].m_counter) {
result = plantInfo[g_unk0x100f0fb8[i]].m_entity; result = plantInfo[g_unk0x100f0fb8[i]].m_entity;
break; break;
} }
@ -809,13 +808,13 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
break; break;
case 5: case 5:
if (buildingInfo[4].m_unk0x11) { if (buildingInfo[4].m_counter) {
result = buildingInfo[4].m_entity; result = buildingInfo[4].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f0fe8[i] != -1; i++) { for (i = 0; g_unk0x100f0fe8[i] != -1; i++) {
if (plantInfo[g_unk0x100f0fe8[i]].m_unk0x16) { if (plantInfo[g_unk0x100f0fe8[i]].m_counter) {
result = plantInfo[g_unk0x100f0fe8[i]].m_entity; result = plantInfo[g_unk0x100f0fe8[i]].m_entity;
break; break;
} }
@ -823,13 +822,13 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
break; break;
case 6: case 6:
if (buildingInfo[2].m_unk0x11) { if (buildingInfo[2].m_counter) {
result = buildingInfo[2].m_entity; result = buildingInfo[2].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f1000[i] != -1; i++) { for (i = 0; g_unk0x100f1000[i] != -1; i++) {
if (plantInfo[g_unk0x100f1000[i]].m_unk0x16) { if (plantInfo[g_unk0x100f1000[i]].m_counter) {
result = plantInfo[g_unk0x100f1000[i]].m_entity; result = plantInfo[g_unk0x100f1000[i]].m_entity;
break; break;
} }
@ -837,13 +836,13 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
} }
break; break;
case 7: case 7:
if (buildingInfo[6].m_unk0x11) { if (buildingInfo[6].m_counter) {
result = buildingInfo[6].m_entity; result = buildingInfo[6].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }
else { else {
for (i = 0; g_unk0x100f1018[i] != -1; i++) { for (i = 0; g_unk0x100f1018[i] != -1; i++) {
if (plantInfo[g_unk0x100f1018[i]].m_unk0x16) { if (plantInfo[g_unk0x100f1018[i]].m_counter) {
result = plantInfo[g_unk0x100f1018[i]].m_entity; result = plantInfo[g_unk0x100f1018[i]].m_entity;
break; break;
} }
@ -852,7 +851,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
break; break;
case 8: case 8:
for (i = 0; g_unk0x100f1030[i] != -1; i++) { for (i = 0; g_unk0x100f1030[i] != -1; i++) {
if (plantInfo[g_unk0x100f1030[i]].m_unk0x16) { if (plantInfo[g_unk0x100f1030[i]].m_counter) {
result = plantInfo[g_unk0x100f1030[i]].m_entity; result = plantInfo[g_unk0x100f1030[i]].m_entity;
break; break;
} }
@ -862,7 +861,7 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
return result; return result;
} }
if (buildingInfo[15].m_unk0x11) { if (buildingInfo[15].m_counter) {
result = buildingInfo[15].m_entity; result = buildingInfo[15].m_entity;
*p_param = TRUE; *p_param = TRUE;
} }

View File

@ -138,8 +138,8 @@ MxU32 Act3Actor::VTable0x90(float p_time, Matrix4& p_transform)
m_unk0x1c = 0; m_unk0x1c = 0;
positionRef -= g_unk0x10104ef0; positionRef -= g_unk0x10104ef0;
m_roi->FUN_100a58f0(p_transform); m_roi->SetLocal2World(p_transform);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
return TRUE; return TRUE;
} }
} }
@ -163,8 +163,8 @@ MxResult Act3Actor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
Vector3(local2world[3]) += g_unk0x10104ef0; Vector3(local2world[3]) += g_unk0x10104ef0;
roi->FUN_100a58f0(local2world); roi->SetLocal2World(local2world);
roi->VTable0x14(); roi->WrappedUpdateWorldData();
p_actor->SetActorState(c_two | c_noCollide); p_actor->SetActorState(c_two | c_noCollide);
} }
@ -244,7 +244,7 @@ void Act3Cop::ParseAction(char* p_extra)
} }
} }
Mx4DPointFloat* boundary0x14 = boundary->GetUnknown0x14(); Mx4DPointFloat* boundary0x14 = boundary->GetUp();
if (point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) <= 0.001 && if (point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) <= 0.001 &&
point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) >= -0.001) { point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) >= -0.001) {
@ -353,7 +353,7 @@ MxResult Act3Cop::FUN_10040360()
local7c, local7c,
local5c, local5c,
boundary, boundary,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&local34 &local34
) != SUCCESS) { ) != SUCCESS) {
delete grec; delete grec;
@ -391,7 +391,7 @@ MxResult Act3Cop::FUN_10040360()
local88, local88,
localec, localec,
donut->GetBoundary(), donut->GetBoundary(),
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&locald8 &locald8
) == SUCCESS && ) == SUCCESS &&
(grec == NULL || locald8 < local18)) { (grec == NULL || locald8 < local18)) {
@ -431,7 +431,7 @@ MxResult Act3Cop::FUN_10040360()
localf8, localf8,
local108, local108,
boundary, boundary,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&local100 &local100
) != SUCCESS) { ) != SUCCESS) {
local14c = local150 = grec; local14c = local150 = grec;
@ -579,7 +579,7 @@ void Act3Brickster::Animate(float p_time)
} }
if (m_unk0x54 < p_time) { if (m_unk0x54 < p_time) {
((Act3*) m_world)->FUN_10072ad0(5); ((Act3*) m_world)->TriggerHitSound(5);
m_unk0x54 = p_time + 15000.0f; m_unk0x54 = p_time + 15000.0f;
} }
@ -595,7 +595,7 @@ void Act3Brickster::Animate(float p_time)
assert(SoundManager()->GetCacheSoundManager()); assert(SoundManager()->GetCacheSoundManager());
if (m_unk0x58 >= 8) { if (m_unk0x58 >= 8) {
((Act3*) m_world)->FUN_10072ad0(6); ((Act3*) m_world)->TriggerHitSound(6);
} }
else { else {
SoundManager()->GetCacheSoundManager()->Play("eatpz", NULL, FALSE); SoundManager()->GetCacheSoundManager()->Play("eatpz", NULL, FALSE);
@ -607,8 +607,8 @@ void Act3Brickster::Animate(float p_time)
assert(m_shootAnim && m_pInfo); assert(m_shootAnim && m_pInfo);
if (m_unk0x50 < p_time) { if (m_unk0x50 < p_time) {
while (m_pInfo->m_unk0x16) { while (m_pInfo->m_counter) {
PlantManager()->FUN_10026c50(m_pInfo->m_entity); PlantManager()->DecrementCounter(m_pInfo->m_entity);
} }
assert(SoundManager()->GetCacheSoundManager()); assert(SoundManager()->GetCacheSoundManager());
@ -653,8 +653,8 @@ void Act3Brickster::Animate(float p_time)
assert(SoundManager()->GetCacheSoundManager()); assert(SoundManager()->GetCacheSoundManager());
SoundManager()->GetCacheSoundManager()->Play("thpt", NULL, FALSE); SoundManager()->GetCacheSoundManager()->Play("thpt", NULL, FALSE);
while (m_bInfo->m_unk0x11 > 0 || m_bInfo->m_unk0x11 == -1) { while (m_bInfo->m_counter > 0 || m_bInfo->m_counter == -1) {
if (!BuildingManager()->FUN_10030110(m_bInfo)) { if (!BuildingManager()->DecrementCounter(m_bInfo)) {
break; break;
} }
} }
@ -831,7 +831,7 @@ MxResult Act3Brickster::FUN_100417c0()
local88, local88,
localec, localec,
pizza->GetBoundary(), pizza->GetBoundary(),
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&locald8 &locald8
) == SUCCESS && ) == SUCCESS &&
(grec == NULL || locald8 < local18)) { (grec == NULL || locald8 < local18)) {
@ -865,7 +865,7 @@ MxResult Act3Brickster::FUN_100417c0()
float local124; float local124;
for (MxS32 i = 0; i < length; i++) { for (MxS32 i = 0; i < length; i++) {
if (bInfo[i].m_unk0x11 < 0 && bInfo[i].m_boundary != NULL && bInfo[i].m_entity != NULL && i != 0 && if (bInfo[i].m_counter < 0 && bInfo[i].m_boundary != NULL && bInfo[i].m_entity != NULL && i != 0 &&
(local120 == -1 || i != 15)) { (local120 == -1 || i != 15)) {
Mx3DPointFloat local188(bInfo[i].m_x, bInfo[i].m_y, bInfo[i].m_z); Mx3DPointFloat local188(bInfo[i].m_x, bInfo[i].m_y, bInfo[i].m_z);
@ -915,7 +915,7 @@ MxResult Act3Brickster::FUN_100417c0()
local108, local108,
local138, local138,
localf4, localf4,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&local13c &local13c
) != SUCCESS) { ) != SUCCESS) {
local1bc = local1c0 = grec; local1bc = local1c0 = grec;
@ -1055,7 +1055,7 @@ MxS32 Act3Brickster::FUN_10042300()
assert(m_boundary && m_destEdge && m_roi); assert(m_boundary && m_destEdge && m_roi);
LegoPathBoundary* boundaries[2]; LegoPathBoundary* boundaries[2];
LegoUnknown100db7f4* maxE = NULL; LegoOrientedEdge* maxE = NULL;
boundaries[0] = m_boundary; boundaries[0] = m_boundary;
if (m_destEdge->FUN_10048c40(local38)) { if (m_destEdge->FUN_10048c40(local38)) {
@ -1069,7 +1069,7 @@ MxS32 Act3Brickster::FUN_10042300()
for (MxS32 i = 0; i < (MxS32) sizeOfArray(boundaries); i++) { for (MxS32 i = 0; i < (MxS32) sizeOfArray(boundaries); i++) {
if (boundaries[i] != NULL) { if (boundaries[i] != NULL) {
for (MxS32 j = 0; j < boundaries[i]->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundaries[i]->GetNumEdges(); j++) {
LegoUnknown100db7f4* e = boundaries[i]->GetEdges()[j]; LegoOrientedEdge* e = boundaries[i]->GetEdges()[j];
if (e->GetMask0x03()) { if (e->GetMask0x03()) {
Mx3DPointFloat local94(*e->GetPointA()); Mx3DPointFloat local94(*e->GetPointA());
@ -1109,7 +1109,7 @@ MxS32 Act3Brickster::FUN_10042300()
// FUNCTION: LEGO1 0x10042990 // FUNCTION: LEGO1 0x10042990
// FUNCTION: BETA10 0x1001b6e2 // FUNCTION: BETA10 0x1001b6e2
void Act3Brickster::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) void Act3Brickster::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4)
{ {
if (m_unk0x38 != 8) { if (m_unk0x38 != 8) {
m_boundary->SwitchBoundary(this, p_boundary, p_edge, p_unk0xe4); m_boundary->SwitchBoundary(this, p_boundary, p_edge, p_unk0xe4);

View File

@ -70,7 +70,9 @@ MxResult Act3Ammo::Remove()
// FUNCTION: BETA10 0x1001d8b3 // FUNCTION: BETA10 0x1001d8b3
MxResult Act3Ammo::Create(Act3* p_world, MxU32 p_isPizza, MxS32 p_index) MxResult Act3Ammo::Create(Act3* p_world, MxU32 p_isPizza, MxS32 p_index)
{ {
#ifdef BETA10
assert(m_ammoFlag); assert(m_ammoFlag);
#endif
char name[12]; char name[12];
if (p_isPizza) { if (p_isPizza) {
@ -271,8 +273,8 @@ void Act3Ammo::Animate(float p_time)
positionRef.Clear(); positionRef.Clear();
transform.RotateX(0.6); transform.RotateX(0.6);
positionRef = position; positionRef = position;
m_roi->FUN_100a58f0(transform); m_roi->SetLocal2World(transform);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
return; return;
} }
else { else {
@ -280,8 +282,8 @@ void Act3Ammo::Animate(float p_time)
m_unk0x158 = 0; m_unk0x158 = 0;
positionRef -= g_unk0x10104f08; positionRef -= g_unk0x10104f08;
m_roi->FUN_100a58f0(transform); m_roi->SetLocal2World(transform);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
return; return;
} }
} }
@ -337,7 +339,7 @@ void Act3Ammo::Animate(float p_time)
Vector3 local174(local104[2]); Vector3 local174(local104[2]);
if (IsPizza()) { if (IsPizza()) {
local184 = *m_boundary->GetUnknown0x14(); local184 = *m_boundary->GetUp();
local17c[0] = 1.0f; local17c[0] = 1.0f;
local17c[1] = local17c[2] = 0.0f; local17c[1] = local17c[2] = 0.0f;
local174.EqualsCross(local17c, local184); local174.EqualsCross(local17c, local184);
@ -345,7 +347,7 @@ void Act3Ammo::Animate(float p_time)
local17c.EqualsCross(local184, local174); local17c.EqualsCross(local184, local174);
} }
else { else {
local17c = *m_boundary->GetUnknown0x14(); local17c = *m_boundary->GetUp();
local184[0] = 1.0f; local184[0] = 1.0f;
local184[1] = local184[2] = 0.0f; local184[1] = local184[2] = 0.0f;
local174.EqualsCross(local17c, local184); local174.EqualsCross(local17c, local184);
@ -363,8 +365,8 @@ void Act3Ammo::Animate(float p_time)
MxMatrix localb0(local104); MxMatrix localb0(local104);
local104.Product(local60, localb0); local104.Product(local60, localb0);
m_roi->FUN_100a58f0(local104); m_roi->SetLocal2World(local104);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
if (m_BADuration <= m_unk0x7c) { if (m_BADuration <= m_unk0x7c) {
m_worldSpeed = 0.0f; m_worldSpeed = 0.0f;
@ -376,11 +378,11 @@ void Act3Ammo::Animate(float p_time)
if (IsBit4()) { if (IsBit4()) {
if (IsPizza()) { if (IsPizza()) {
m_world->RemovePizza(*this); m_world->RemovePizza(*this);
m_world->FUN_10072ad0(2); m_world->TriggerHitSound(2);
} }
else { else {
m_world->RemoveDonut(*this); m_world->RemoveDonut(*this);
m_world->FUN_10072ad0(4); m_world->TriggerHitSound(4);
} }
} }
else { else {

View File

@ -37,9 +37,9 @@ Ambulance::Ambulance()
m_state = NULL; m_state = NULL;
m_unk0x168 = 0; m_unk0x168 = 0;
m_actorId = -1; m_actorId = -1;
m_unk0x16c = 0; m_atPoliceTask = 0;
m_unk0x16e = 0; m_atBeachTask = 0;
m_unk0x170 = 0; m_taskState = Ambulance::e_none;
m_lastAction = IsleScript::c_noneIsle; m_lastAction = IsleScript::c_noneIsle;
m_unk0x172 = 0; m_unk0x172 = 0;
m_lastAnimation = IsleScript::c_noneIsle; m_lastAnimation = IsleScript::c_noneIsle;
@ -70,7 +70,7 @@ MxResult Ambulance::Create(MxDSAction& p_dsAction)
m_state = (AmbulanceMissionState*) GameState()->GetState("AmbulanceMissionState"); m_state = (AmbulanceMissionState*) GameState()->GetState("AmbulanceMissionState");
if (!m_state) { if (!m_state) {
m_state = new AmbulanceMissionState(); m_state = new AmbulanceMissionState();
m_state->m_unk0x08 = 0; m_state->m_state = AmbulanceMissionState::e_ready;
GameState()->RegisterState(m_state); GameState()->RegisterState(m_state);
} }
} }
@ -170,25 +170,25 @@ MxLong Ambulance::HandleEndAction(MxEndActionNotificationParam& p_param)
m_lastAction = IsleScript::c_noneIsle; m_lastAction = IsleScript::c_noneIsle;
} }
else if (objectId == IsleScript::c_hho027en_RunAnim) { else if (objectId == IsleScript::c_hho027en_RunAnim) {
m_state->m_unk0x08 = 1; m_state->m_state = AmbulanceMissionState::e_enteredAmbulance;
CurrentWorld()->PlaceActor(UserActor()); CurrentWorld()->PlaceActor(UserActor());
HandleClick(); HandleClick();
m_unk0x172 = 0; m_unk0x172 = 0;
TickleManager()->RegisterClient(this, 40000); TickleManager()->RegisterClient(this, 40000);
} }
else if (objectId == IsleScript::c_hpz047pe_RunAnim || objectId == IsleScript::c_hpz048pe_RunAnim || objectId == IsleScript::c_hpz049bd_RunAnim || objectId == IsleScript::c_hpz053pa_RunAnim) { else if (objectId == IsleScript::c_hpz047pe_RunAnim || objectId == IsleScript::c_hpz048pe_RunAnim || objectId == IsleScript::c_hpz049bd_RunAnim || objectId == IsleScript::c_hpz053pa_RunAnim) {
if (m_unk0x170 == 3) { if (m_taskState == Ambulance::e_finished) {
PlayAnimation(IsleScript::c_hpz055pa_RunAnim); PlayAnimation(IsleScript::c_hpz055pa_RunAnim);
m_unk0x170 = 0; m_taskState = Ambulance::e_none;
} }
else { else {
PlayAnimation(IsleScript::c_hpz053pa_RunAnim); PlayAnimation(IsleScript::c_hpz053pa_RunAnim);
} }
} }
else if (objectId == IsleScript::c_hpz050bd_RunAnim || objectId == IsleScript::c_hpz052ma_RunAnim) { else if (objectId == IsleScript::c_hpz050bd_RunAnim || objectId == IsleScript::c_hpz052ma_RunAnim) {
if (m_unk0x170 == 3) { if (m_taskState == Ambulance::e_finished) {
PlayAnimation(IsleScript::c_hpz057ma_RunAnim); PlayAnimation(IsleScript::c_hpz057ma_RunAnim);
m_unk0x170 = 0; m_taskState = Ambulance::e_none;
} }
else { else {
PlayAnimation(IsleScript::c_hpz052ma_RunAnim); PlayAnimation(IsleScript::c_hpz052ma_RunAnim);
@ -201,18 +201,18 @@ MxLong Ambulance::HandleEndAction(MxEndActionNotificationParam& p_param)
m_unk0x172 = 0; m_unk0x172 = 0;
TickleManager()->RegisterClient(this, 40000); TickleManager()->RegisterClient(this, 40000);
if (m_unk0x16c != 0) { if (m_atPoliceTask != 0) {
StopActions(); StopActions();
} }
} }
else if (objectId == IsleScript::c_hps116bd_RunAnim || objectId == IsleScript::c_hps118re_RunAnim) { else if (objectId == IsleScript::c_hps116bd_RunAnim || objectId == IsleScript::c_hps118re_RunAnim) {
if (objectId == IsleScript::c_hps116bd_RunAnim && m_unk0x170 != 3) { if (objectId == IsleScript::c_hps116bd_RunAnim && m_taskState != Ambulance::e_finished) {
PlayAction(IsleScript::c_Avo923In_PlayWav); PlayAction(IsleScript::c_Avo923In_PlayWav);
} }
if (m_unk0x170 == 3) { if (m_taskState == Ambulance::e_finished) {
PlayAnimation(IsleScript::c_hps117bd_RunAnim); PlayAnimation(IsleScript::c_hps117bd_RunAnim);
m_unk0x170 = 0; m_taskState = Ambulance::e_none;
} }
else { else {
PlayAnimation(IsleScript::c_hps118re_RunAnim); PlayAnimation(IsleScript::c_hps118re_RunAnim);
@ -221,16 +221,16 @@ MxLong Ambulance::HandleEndAction(MxEndActionNotificationParam& p_param)
else if (objectId == IsleScript::c_hps117bd_RunAnim) { else if (objectId == IsleScript::c_hps117bd_RunAnim) {
CurrentWorld()->PlaceActor(UserActor()); CurrentWorld()->PlaceActor(UserActor());
HandleClick(); HandleClick();
SpawnPlayer(LegoGameState::e_unk33, TRUE, 0); SpawnPlayer(LegoGameState::e_policeExited, TRUE, 0);
m_unk0x172 = 0; m_unk0x172 = 0;
TickleManager()->RegisterClient(this, 40000); TickleManager()->RegisterClient(this, 40000);
if (m_unk0x16e != 0) { if (m_atBeachTask != 0) {
StopActions(); StopActions();
} }
} }
else if (objectId == IsleScript::c_hho142cl_RunAnim || objectId == IsleScript::c_hho143cl_RunAnim || objectId == IsleScript::c_hho144cl_RunAnim) { else if (objectId == IsleScript::c_hho142cl_RunAnim || objectId == IsleScript::c_hho143cl_RunAnim || objectId == IsleScript::c_hho144cl_RunAnim) {
FUN_10037250(); Reset();
} }
} }
@ -241,18 +241,18 @@ MxLong Ambulance::HandleEndAction(MxEndActionNotificationParam& p_param)
// FUNCTION: BETA10 0x100230bf // FUNCTION: BETA10 0x100230bf
MxLong Ambulance::HandleButtonDown(LegoControlManagerNotificationParam& p_param) MxLong Ambulance::HandleButtonDown(LegoControlManagerNotificationParam& p_param)
{ {
if (m_unk0x170 == 1) { if (m_taskState == Ambulance::e_waiting) {
LegoROI* roi = PickROI(p_param.GetX(), p_param.GetY()); LegoROI* roi = PickROI(p_param.GetX(), p_param.GetY());
if (roi != NULL && !strcmpi(roi->GetName(), "ps-gate")) { if (roi != NULL && !strcmpi(roi->GetName(), "ps-gate")) {
m_unk0x170 = 3; m_taskState = Ambulance::e_finished;
return 1; return 1;
} }
roi = PickRootROI(p_param.GetX(), p_param.GetY()); roi = PickRootROI(p_param.GetX(), p_param.GetY());
if (roi != NULL && !strcmpi(roi->GetName(), "gd")) { if (roi != NULL && !strcmpi(roi->GetName(), "gd")) {
m_unk0x170 = 3; m_taskState = Ambulance::e_finished;
return 1; return 1;
} }
} }
@ -270,9 +270,9 @@ MxLong Ambulance::HandlePathStruct(LegoPathStructNotificationParam& p_param)
} }
if (p_param.GetTrigger() == LegoPathStruct::c_camAnim && p_param.GetData() == 0x0b) { if (p_param.GetTrigger() == LegoPathStruct::c_camAnim && p_param.GetData() == 0x0b) {
if (m_unk0x16e != 0) { if (m_atBeachTask != 0) {
if (m_unk0x16c != 0) { if (m_atPoliceTask != 0) {
m_state->m_unk0x08 = 2; m_state->m_state = AmbulanceMissionState::e_prepareAmbulance;
if (m_lastAction != IsleScript::c_noneIsle) { if (m_lastAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL);
@ -297,7 +297,7 @@ MxLong Ambulance::HandlePathStruct(LegoPathStructNotificationParam& p_param)
return 0; return 0;
} }
if (m_unk0x16e != 0) { if (m_atBeachTask != 0) {
if (m_lastAction != IsleScript::c_noneIsle) { if (m_lastAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL);
} }
@ -307,7 +307,7 @@ MxLong Ambulance::HandlePathStruct(LegoPathStructNotificationParam& p_param)
} }
} }
if (m_unk0x16c != 0) { if (m_atPoliceTask != 0) {
if (m_lastAction != IsleScript::c_noneIsle) { if (m_lastAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL);
} }
@ -315,9 +315,9 @@ MxLong Ambulance::HandlePathStruct(LegoPathStructNotificationParam& p_param)
PlayAction(IsleScript::c_Avo915In_PlayWav); PlayAction(IsleScript::c_Avo915In_PlayWav);
} }
} }
else if (p_param.GetTrigger() == LegoPathStruct::c_s && p_param.GetData() == 0x131 && m_unk0x16e == 0) { else if (p_param.GetTrigger() == LegoPathStruct::c_s && p_param.GetData() == 0x131 && m_atBeachTask == 0) {
m_unk0x16e = 1; m_atBeachTask = 1;
m_unk0x170 = 1; m_taskState = Ambulance::e_waiting;
if (m_lastAction != IsleScript::c_noneIsle) { if (m_lastAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL);
@ -345,9 +345,9 @@ MxLong Ambulance::HandlePathStruct(LegoPathStructNotificationParam& p_param)
break; break;
} }
} }
else if (p_param.GetTrigger() == LegoPathStruct::c_camAnim && (p_param.GetData() == 0x22 || p_param.GetData() == 0x23 || p_param.GetData() == 0x24) && m_unk0x16c == 0) { else if (p_param.GetTrigger() == LegoPathStruct::c_camAnim && (p_param.GetData() == 0x22 || p_param.GetData() == 0x23 || p_param.GetData() == 0x24) && m_atPoliceTask == 0) {
m_unk0x16c = 1; m_atPoliceTask = 1;
m_unk0x170 = 1; m_taskState = Ambulance::e_waiting;
if (m_lastAction != IsleScript::c_noneIsle) { if (m_lastAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_lastAction, NULL);
@ -368,7 +368,7 @@ MxLong Ambulance::HandleClick()
return 1; return 1;
} }
if (m_state->m_unk0x08 == 2) { if (m_state->m_state == AmbulanceMissionState::e_prepareAmbulance) {
return 1; return 1;
} }
@ -387,8 +387,8 @@ MxLong Ambulance::HandleClick()
InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_AmbulanceDashboard, NULL); InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_AmbulanceDashboard, NULL);
ControlManager()->Register(this); ControlManager()->Register(this);
if (m_state->m_unk0x08 == 1) { if (m_state->m_state == AmbulanceMissionState::e_enteredAmbulance) {
SpawnPlayer(LegoGameState::e_unk31, TRUE, 0); SpawnPlayer(LegoGameState::e_hospitalExited, TRUE, 0);
m_state->m_startTime = Timer()->GetTime(); m_state->m_startTime = Timer()->GetTime();
InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_pns018rd_RunAnim, NULL); InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_pns018rd_RunAnim, NULL);
} }
@ -398,9 +398,9 @@ MxLong Ambulance::HandleClick()
// FUNCTION: LEGO1 0x10036e60 // FUNCTION: LEGO1 0x10036e60
// FUNCTION: BETA10 0x100236bb // FUNCTION: BETA10 0x100236bb
void Ambulance::FUN_10036e60() void Ambulance::Init()
{ {
m_state->m_unk0x08 = 2; m_state->m_state = AmbulanceMissionState::e_prepareAmbulance;
PlayAnimation(IsleScript::c_hho027en_RunAnim); PlayAnimation(IsleScript::c_hho027en_RunAnim);
m_lastAction = IsleScript::c_noneIsle; m_lastAction = IsleScript::c_noneIsle;
m_lastAnimation = IsleScript::c_noneIsle; m_lastAnimation = IsleScript::c_noneIsle;
@ -411,7 +411,7 @@ void Ambulance::Exit()
{ {
GameState()->m_currentArea = LegoGameState::e_hospitalExterior; GameState()->m_currentArea = LegoGameState::e_hospitalExterior;
StopActions(); StopActions();
FUN_10037250(); Reset();
Leave(); Leave();
} }
@ -441,14 +441,14 @@ MxLong Ambulance::HandleControl(LegoControlManagerNotificationParam& p_param)
switch (p_param.m_clickedObjectId) { switch (p_param.m_clickedObjectId) {
case IsleScript::c_AmbulanceArms_Ctl: case IsleScript::c_AmbulanceArms_Ctl:
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_AmbulanceInfo_Ctl: case IsleScript::c_AmbulanceInfo_Ctl:
((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain); ((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_AmbulanceHorn_Ctl: case IsleScript::c_AmbulanceHorn_Ctl:
@ -467,11 +467,11 @@ void Ambulance::ActivateSceneActions()
{ {
PlayMusic(JukeboxScript::c_Hospital_Music); PlayMusic(JukeboxScript::c_Hospital_Music);
if (m_state->m_unk0x08 == 1) { if (m_state->m_state == AmbulanceMissionState::e_enteredAmbulance) {
m_state->m_unk0x08 = 0; m_state->m_state = AmbulanceMissionState::e_ready;
PlayAction(IsleScript::c_ham033cl_PlayWav); PlayAction(IsleScript::c_ham033cl_PlayWav);
} }
else if (m_unk0x16c != 0 && m_unk0x16e != 0) { else if (m_atPoliceTask != 0 && m_atBeachTask != 0) {
IsleScript::Script objectId; IsleScript::Script objectId;
switch (rand() % 2) { switch (rand() % 2) {
@ -571,14 +571,14 @@ void Ambulance::StopActions()
} }
// FUNCTION: LEGO1 0x10037250 // FUNCTION: LEGO1 0x10037250
void Ambulance::FUN_10037250() void Ambulance::Reset()
{ {
StopAction(m_lastAction); StopAction(m_lastAction);
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
((Act1State*) GameState()->GetState("Act1State"))->m_unk0x018 = 0; ((Act1State*) GameState()->GetState("Act1State"))->m_unk0x018 = 0;
m_state->m_unk0x08 = 0; m_state->m_state = AmbulanceMissionState::e_ready;
m_unk0x16e = 0; m_atBeachTask = 0;
m_unk0x16c = 0; m_atPoliceTask = 0;
g_isleFlags |= Isle::c_playMusic; g_isleFlags |= Isle::c_playMusic;
AnimationManager()->EnableCamAnims(TRUE); AnimationManager()->EnableCamAnims(TRUE);
AnimationManager()->FUN_1005f6d0(TRUE); AnimationManager()->FUN_1005f6d0(TRUE);
@ -626,7 +626,7 @@ void Ambulance::PlayAction(IsleScript::Script p_objectId)
// FUNCTION: LEGO1 0x100373a0 // FUNCTION: LEGO1 0x100373a0
AmbulanceMissionState::AmbulanceMissionState() AmbulanceMissionState::AmbulanceMissionState()
{ {
m_unk0x08 = 0; m_state = AmbulanceMissionState::e_ready;
m_startTime = 0; m_startTime = 0;
m_peScore = 0; m_peScore = 0;
m_maScore = 0; m_maScore = 0;

View File

@ -52,7 +52,7 @@ void Bike::Exit()
// FUNCTION: LEGO1 0x100769a0 // FUNCTION: LEGO1 0x100769a0
MxLong Bike::HandleClick() MxLong Bike::HandleClick()
{ {
if (FUN_1003ef60()) { if (CanExit()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
FUN_10015820(TRUE, 0); FUN_10015820(TRUE, 0);
@ -85,7 +85,7 @@ MxLong Bike::HandleControl(LegoControlManagerNotificationParam& p_param)
switch (p_param.m_clickedObjectId) { switch (p_param.m_clickedObjectId) {
case IsleScript::c_BikeArms_Ctl: case IsleScript::c_BikeArms_Ctl:
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_BikeInfo_Ctl: case IsleScript::c_BikeInfo_Ctl:

View File

@ -80,7 +80,7 @@ MxLong InfoCenterEntity::HandleClick(LegoEventNotificationParam& p_param)
// FUNCTION: LEGO1 0x100151d0 // FUNCTION: LEGO1 0x100151d0
MxLong GasStationEntity::HandleClick(LegoEventNotificationParam& p_param) MxLong GasStationEntity::HandleClick(LegoEventNotificationParam& p_param)
{ {
if (FUN_1003ef60()) { if (CanExit()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (state->GetUnknown18() != 8) { if (state->GetUnknown18() != 8) {
@ -104,7 +104,7 @@ MxLong GasStationEntity::HandleClick(LegoEventNotificationParam& p_param)
// FUNCTION: LEGO1 0x10015270 // FUNCTION: LEGO1 0x10015270
MxLong HospitalEntity::HandleClick(LegoEventNotificationParam& p_param) MxLong HospitalEntity::HandleClick(LegoEventNotificationParam& p_param)
{ {
if (FUN_1003ef60()) { if (CanExit()) {
Act1State* act1State = (Act1State*) GameState()->GetState("Act1State"); Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
if (act1State->GetUnknown18() != 10) { if (act1State->GetUnknown18() != 10) {
@ -128,7 +128,7 @@ MxLong HospitalEntity::HandleClick(LegoEventNotificationParam& p_param)
// FUNCTION: LEGO1 0x10015310 // FUNCTION: LEGO1 0x10015310
MxLong PoliceEntity::HandleClick(LegoEventNotificationParam& p_param) MxLong PoliceEntity::HandleClick(LegoEventNotificationParam& p_param)
{ {
if (FUN_1003ef60()) { if (CanExit()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (state->GetUnknown18() != 10) { if (state->GetUnknown18() != 10) {
@ -152,7 +152,7 @@ MxLong PoliceEntity::HandleClick(LegoEventNotificationParam& p_param)
// FUNCTION: LEGO1 0x100153b0 // FUNCTION: LEGO1 0x100153b0
MxLong BeachHouseEntity::HandleClick(LegoEventNotificationParam& p_param) MxLong BeachHouseEntity::HandleClick(LegoEventNotificationParam& p_param)
{ {
if (FUN_1003ef60()) { if (CanExit()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
state->SetUnknown18(0); state->SetUnknown18(0);
@ -173,7 +173,7 @@ MxLong BeachHouseEntity::HandleClick(LegoEventNotificationParam& p_param)
// FUNCTION: LEGO1 0x10015450 // FUNCTION: LEGO1 0x10015450
MxLong RaceStandsEntity::HandleClick(LegoEventNotificationParam& p_param) MxLong RaceStandsEntity::HandleClick(LegoEventNotificationParam& p_param)
{ {
if (FUN_1003ef60()) { if (CanExit()) {
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
state->SetUnknown18(0); state->SetUnknown18(0);
@ -195,7 +195,7 @@ MxLong RaceStandsEntity::HandleClick(LegoEventNotificationParam& p_param)
// FUNCTION: BETA10 0x100256e8 // FUNCTION: BETA10 0x100256e8
MxLong JailEntity::HandleClick(LegoEventNotificationParam& p_param) MxLong JailEntity::HandleClick(LegoEventNotificationParam& p_param)
{ {
if (FUN_1003ef60()) { if (CanExit()) {
PlayCamAnim(UserActor(), FALSE, 18, TRUE); PlayCamAnim(UserActor(), FALSE, 18, TRUE);
} }

View File

@ -89,24 +89,24 @@ void Doors::Animate(float p_time)
local10.Clear(); local10.Clear();
local58.RotateY(-local8); local58.RotateY(-local8);
local10 = m_ltDoorLocal[3]; local10 = m_ltDoorLocal[3];
m_ltDoor->FUN_100a58f0(local58); m_ltDoor->SetLocal2World(local58);
m_ltDoor->VTable0x14(); m_ltDoor->WrappedUpdateWorldData();
local58 = m_rtDoorLocal; local58 = m_rtDoorLocal;
local10.Clear(); local10.Clear();
local58.RotateY(local8); local58.RotateY(local8);
local10 = m_rtDoorLocal[3]; local10 = m_rtDoorLocal[3];
m_rtDoor->FUN_100a58f0(local58); m_rtDoor->SetLocal2World(local58);
m_rtDoor->VTable0x14(); m_rtDoor->WrappedUpdateWorldData();
m_unk0x1f4 = local8; m_unk0x1f4 = local8;
} }
if (m_unk0x158 + g_unk0x100d8e84 < p_time) { if (m_unk0x158 + g_unk0x100d8e84 < p_time) {
m_ltDoor->FUN_100a58f0(m_ltDoorLocal); m_ltDoor->SetLocal2World(m_ltDoorLocal);
m_rtDoor->FUN_100a58f0(m_rtDoorLocal); m_rtDoor->SetLocal2World(m_rtDoorLocal);
m_ltDoor->VTable0x14(); m_ltDoor->WrappedUpdateWorldData();
m_rtDoor->VTable0x14(); m_rtDoor->WrappedUpdateWorldData();
m_unk0x154 = 1; m_unk0x154 = 1;
m_actorState = c_initial; m_actorState = c_initial;
m_unk0x1f4 = 0; m_unk0x1f4 = 0;

View File

@ -88,7 +88,7 @@ void DuneBuggy::Exit()
// FUNCTION: LEGO1 0x10068060 // FUNCTION: LEGO1 0x10068060
MxLong DuneBuggy::HandleClick() MxLong DuneBuggy::HandleClick()
{ {
if (!FUN_1003ef60()) { if (!CanExit()) {
return 1; return 1;
} }
@ -125,7 +125,7 @@ MxLong DuneBuggy::HandleControl(LegoControlManagerNotificationParam& p_param)
switch (p_param.m_clickedObjectId) { switch (p_param.m_clickedObjectId) {
case IsleScript::c_DuneCarArms_Ctl: case IsleScript::c_DuneCarArms_Ctl:
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_DuneCarInfo_Ctl: case IsleScript::c_DuneCarInfo_Ctl:

View File

@ -121,7 +121,7 @@ void Helicopter::Exit()
// FUNCTION: BETA10 0x1002a3db // FUNCTION: BETA10 0x1002a3db
MxLong Helicopter::HandleClick() MxLong Helicopter::HandleClick()
{ {
if (!FUN_1003ef60()) { if (!CanExit()) {
return 1; return 1;
} }
@ -203,7 +203,7 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
} }
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_Helicopter_TakeOff_Ctl: { case IsleScript::c_Helicopter_TakeOff_Ctl: {
@ -391,8 +391,8 @@ void Helicopter::VTable0x74(Matrix4& p_transform)
FUN_10010c30(); FUN_10010c30();
} }
else { else {
m_roi->FUN_100a58f0(p_transform); m_roi->SetLocal2World(p_transform);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
if (m_cameraFlag) { if (m_cameraFlag) {
FUN_10010c30(); FUN_10010c30();
} }
@ -455,7 +455,9 @@ void Helicopter::FUN_100042a0(const Matrix4& p_matrix)
Vector3 vec3(m_unk0x1a8[0]); // locala8 // esp+0x20 Vector3 vec3(m_unk0x1a8[0]); // locala8 // esp+0x20
Vector3 vec4(m_unk0x1a8[1]); // localb8 // esp+0x10 Vector3 vec4(m_unk0x1a8[1]); // localb8 // esp+0x10
Vector3 vec5(m_unk0x1a8[2]); // EDI Vector3 vec5(m_unk0x1a8[2]); // EDI
Vector3 vec6(m_unk0x1a8[3]); // locala0 // esp+0x28
// the typecast makes this function match for unknown reasons
Vector3 vec6((const float*) m_unk0x1a8[3]); // locala0 // esp+0x28
m_world->GetCameraController()->FUN_100123b0(local48); m_world->GetCameraController()->FUN_100123b0(local48);
m_unk0x1a8.SetIdentity(); m_unk0x1a8.SetIdentity();

View File

@ -119,11 +119,11 @@ void IslePathActor::Exit()
MxS32 i; MxS32 i;
for (i = 0; i < m_boundary->GetNumEdges(); i++) { for (i = 0; i < m_boundary->GetNumEdges(); i++) {
LegoUnknown100db7f4* e = (LegoUnknown100db7f4*) m_boundary->GetEdges()[i]; LegoOrientedEdge* e = (LegoOrientedEdge*) m_boundary->GetEdges()[i];
assert(e); assert(e);
Mx3DPointFloat local20; Mx3DPointFloat local20;
e->FUN_1002ddc0(*m_boundary, local20); e->GetFaceNormal(*m_boundary, local20);
local20 *= m_roi->GetWorldBoundingSphere().Radius(); local20 *= m_roi->GetWorldBoundingSphere().Radius();
local20 += GetWorldPosition(); local20 += GetWorldPosition();
@ -148,12 +148,12 @@ void IslePathActor::Exit()
} }
m_previousActor->SetActorState(c_initial); m_previousActor->SetActorState(c_initial);
GameState()->m_currentArea = LegoGameState::Area::e_unk66; GameState()->m_currentArea = LegoGameState::Area::e_vehicleExited;
} }
FUN_1001b660(); FUN_1001b660();
FUN_10010c30(); FUN_10010c30();
FUN_1003eda0(); ResetViewVelocity();
} }
// GLOBAL: LEGO1 0x10102b28 // GLOBAL: LEGO1 0x10102b28
@ -199,7 +199,7 @@ void IslePathActor::RegisterSpawnLocations()
JukeboxScript::c_Quiet_Audio JukeboxScript::c_Quiet_Audio
); );
g_spawnLocations[3] = SpawnLocation( g_spawnLocations[3] = SpawnLocation(
LegoGameState::e_unk4, LegoGameState::e_infocenterExited,
g_isleScript, g_isleScript,
0, 0,
"int46", "int46",
@ -223,7 +223,7 @@ void IslePathActor::RegisterSpawnLocations()
JukeboxScript::c_Beach_Music JukeboxScript::c_Beach_Music
); );
g_spawnLocations[5] = SpawnLocation( g_spawnLocations[5] = SpawnLocation(
LegoGameState::e_unk17, LegoGameState::e_jetskibuildExited,
g_isleScript, g_isleScript,
0, 0,
"EDG00_46", "EDG00_46",
@ -259,7 +259,7 @@ void IslePathActor::RegisterSpawnLocations()
JukeboxScript::c_CentralNorthRoad_Music JukeboxScript::c_CentralNorthRoad_Music
); );
g_spawnLocations[8] = SpawnLocation( g_spawnLocations[8] = SpawnLocation(
LegoGameState::e_unk20, LegoGameState::e_racecarbuildExited,
g_isleScript, g_isleScript,
0, 0,
"INT16", "INT16",
@ -295,7 +295,7 @@ void IslePathActor::RegisterSpawnLocations()
JukeboxScript::c_GarageArea_Music JukeboxScript::c_GarageArea_Music
); );
g_spawnLocations[11] = SpawnLocation( g_spawnLocations[11] = SpawnLocation(
LegoGameState::e_unk28, LegoGameState::e_garageExited,
g_isleScript, g_isleScript,
0, 0,
"INT24", "INT24",
@ -319,7 +319,7 @@ void IslePathActor::RegisterSpawnLocations()
JukeboxScript::c_Hospital_Music JukeboxScript::c_Hospital_Music
); );
g_spawnLocations[13] = SpawnLocation( g_spawnLocations[13] = SpawnLocation(
LegoGameState::e_unk31, LegoGameState::e_hospitalExited,
g_isleScript, g_isleScript,
0, 0,
"EDG02_28", "EDG02_28",
@ -343,7 +343,7 @@ void IslePathActor::RegisterSpawnLocations()
JukeboxScript::c_PoliceStation_Music JukeboxScript::c_PoliceStation_Music
); );
g_spawnLocations[15] = SpawnLocation( g_spawnLocations[15] = SpawnLocation(
LegoGameState::e_unk33, LegoGameState::e_policeExited,
g_isleScript, g_isleScript,
0, 0,
"EDG02_64", "EDG02_64",
@ -598,7 +598,7 @@ void IslePathActor::SpawnPlayer(LegoGameState::Area p_area, MxBool p_enter, MxU8
} }
if (m_cameraFlag) { if (m_cameraFlag) {
FUN_1003eda0(); ResetViewVelocity();
} }
if (p_flags & c_playMusic && g_spawnLocations[i].m_music != JukeboxScript::c_noneJukebox) { if (p_flags & c_playMusic && g_spawnLocations[i].m_music != JukeboxScript::c_noneJukebox) {
@ -630,9 +630,9 @@ void IslePathActor::VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundar
m_world->Add(this); m_world->Add(this);
} }
m_roi->FUN_100a58f0(p_transform); m_roi->SetLocal2World(p_transform);
if (m_cameraFlag) { if (m_cameraFlag) {
FUN_1003eda0(); ResetViewVelocity();
FUN_10010c30(); FUN_10010c30();
} }
} }
@ -648,6 +648,6 @@ void IslePathActor::FUN_1001b660()
up *= -1.0f; up *= -1.0f;
position.EqualsCross(direction, up); position.EqualsCross(direction, up);
m_roi->FUN_100a58f0(transform); m_roi->SetLocal2World(transform);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
} }

View File

@ -81,7 +81,7 @@ void Jetski::Exit()
MxLong Jetski::HandleClick() MxLong Jetski::HandleClick()
{ {
#ifndef BETA10 #ifndef BETA10
if (!FUN_1003ef60()) { if (!CanExit()) {
return 1; return 1;
} }
@ -143,7 +143,7 @@ MxLong Jetski::HandleControl(LegoControlManagerNotificationParam& p_param)
Exit(); Exit();
((IslePathActor*) UserActor()) ((IslePathActor*) UserActor())
->SpawnPlayer(LegoGameState::e_jetraceExterior, TRUE, c_spawnBit1 | c_playMusic | c_spawnBit3); ->SpawnPlayer(LegoGameState::e_jetraceExterior, TRUE, c_spawnBit1 | c_playMusic | c_spawnBit3);
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
return 1; return 1;
case IsleScript::c_JetskiInfo_Ctl: case IsleScript::c_JetskiInfo_Ctl:
((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain); ((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain);

View File

@ -36,7 +36,7 @@ MxLong JukeBoxEntity::Notify(MxParam& p_param)
MxNotificationParam& param = (MxNotificationParam&) p_param; MxNotificationParam& param = (MxNotificationParam&) p_param;
if (param.GetNotification() == c_notificationClick) { if (param.GetNotification() == c_notificationClick) {
if (!FUN_1003ef60()) { if (!CanExit()) {
return 1; return 1;
} }

View File

@ -84,7 +84,7 @@ void Motocycle::Exit()
// FUNCTION: LEGO1 0x10035c50 // FUNCTION: LEGO1 0x10035c50
MxLong Motocycle::HandleClick() MxLong Motocycle::HandleClick()
{ {
if (!FUN_1003ef60()) { if (!CanExit()) {
return 1; return 1;
} }
@ -119,7 +119,7 @@ MxLong Motocycle::HandleControl(LegoControlManagerNotificationParam& p_param)
switch (p_param.m_clickedObjectId) { switch (p_param.m_clickedObjectId) {
case IsleScript::c_MotoBikeArms_Ctl: case IsleScript::c_MotoBikeArms_Ctl:
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_MotoBikeInfo_Ctl: case IsleScript::c_MotoBikeInfo_Ctl:

View File

@ -136,9 +136,9 @@ Pizza::Pizza()
m_mission = NULL; m_mission = NULL;
m_skateBoard = NULL; m_skateBoard = NULL;
m_act1state = NULL; m_act1state = NULL;
m_unk0x8c = IsleScript::c_noneIsle; m_speechAction = IsleScript::c_noneIsle;
m_unk0x98 = FALSE; m_unk0x98 = FALSE;
m_unk0x90 = INT_MIN; m_startTime = INT_MIN;
} }
// FUNCTION: LEGO1 0x10038100 // FUNCTION: LEGO1 0x10038100
@ -188,7 +188,7 @@ void Pizza::FUN_10038220(IsleScript::Script p_objectId)
AnimationManager()->EnableCamAnims(FALSE); AnimationManager()->EnableCamAnims(FALSE);
AnimationManager()->FUN_1005f6d0(FALSE); AnimationManager()->FUN_1005f6d0(FALSE);
PlayAction(p_objectId, FALSE); PlayAction(p_objectId, FALSE);
m_unk0x8c = IsleScript::c_noneIsle; m_speechAction = IsleScript::c_noneIsle;
} }
// FUNCTION: LEGO1 0x100382b0 // FUNCTION: LEGO1 0x100382b0
@ -196,8 +196,8 @@ void Pizza::FUN_10038220(IsleScript::Script p_objectId)
void Pizza::FUN_100382b0() void Pizza::FUN_100382b0()
{ {
if (m_state->m_unk0x0c != 8) { if (m_state->m_unk0x0c != 8) {
if (m_unk0x8c != IsleScript::c_noneIsle) { if (m_speechAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x8c, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_speechAction, NULL);
} }
m_act1state->m_unk0x018 = 0; m_act1state->m_unk0x018 = 0;
@ -209,10 +209,10 @@ void Pizza::FUN_100382b0()
m_mission->m_startTime = INT_MIN; m_mission->m_startTime = INT_MIN;
m_mission = NULL; m_mission = NULL;
m_unk0x98 = FALSE; m_unk0x98 = FALSE;
m_unk0x8c = IsleScript::c_noneIsle; m_speechAction = IsleScript::c_noneIsle;
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
m_unk0x90 = INT_MIN; m_startTime = INT_MIN;
m_skateBoard->EnableScenePresentation(FALSE); m_skateBoard->EnableScenePresentation(FALSE);
m_skateBoard->SetPizzaVisible(FALSE); m_skateBoard->SetPizzaVisible(FALSE);
MxTrace("Pizza mission: idle\n"); MxTrace("Pizza mission: idle\n");
@ -254,7 +254,7 @@ MxLong Pizza::HandleClick()
IsleScript::Script action; IsleScript::Script action;
switch (m_state->FUN_10039540()) { switch (m_state->GetActorState()) {
case 0: case 0:
action = m_mission->m_actions[m_mission->m_numActions + 3]; action = m_mission->m_actions[m_mission->m_numActions + 3];
break; break;
@ -284,7 +284,7 @@ MxLong Pizza::HandlePathStruct(LegoPathStructNotificationParam& p_param)
if (p_param.GetTrigger() == LegoPathStruct::c_s && p_param.GetData() == 0x12e && if (p_param.GetTrigger() == LegoPathStruct::c_s && p_param.GetData() == 0x12e &&
GameState()->GetActorId() == LegoActor::c_pepper) { GameState()->GetActorId() == LegoActor::c_pepper) {
m_state->m_unk0x0c = 5; m_state->m_unk0x0c = 5;
m_state->SetUnknown0xb0(SndanimScript::c_TRS302_OpenJailDoor); m_state->SetPlayedAction(SndanimScript::c_TRS302_OpenJailDoor);
if (time < m_mission->GetRedFinishTime()) { if (time < m_mission->GetRedFinishTime()) {
m_mission->UpdateScore(LegoState::e_red); m_mission->UpdateScore(LegoState::e_red);
@ -325,26 +325,26 @@ MxLong Pizza::HandlePathStruct(LegoPathStructNotificationParam& p_param)
case IsleScript::c_pps025ni_RunAnim: case IsleScript::c_pps025ni_RunAnim:
case IsleScript::c_pps026ni_RunAnim: case IsleScript::c_pps026ni_RunAnim:
case IsleScript::c_pps027ni_RunAnim: case IsleScript::c_pps027ni_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 3800; m_duration = 3800;
break; break;
case IsleScript::c_pgs050nu_RunAnim: case IsleScript::c_pgs050nu_RunAnim:
case IsleScript::c_pgs051nu_RunAnim: case IsleScript::c_pgs051nu_RunAnim:
case IsleScript::c_pgs052nu_RunAnim: case IsleScript::c_pgs052nu_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 6400; m_duration = 6400;
break; break;
case IsleScript::c_prt072sl_RunAnim: case IsleScript::c_prt072sl_RunAnim:
case IsleScript::c_prt073sl_RunAnim: case IsleScript::c_prt073sl_RunAnim:
case IsleScript::c_prt074sl_RunAnim: case IsleScript::c_prt074sl_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 7000; m_duration = 7000;
break; break;
case IsleScript::c_pho104re_RunAnim: case IsleScript::c_pho104re_RunAnim:
case IsleScript::c_pho105re_RunAnim: case IsleScript::c_pho105re_RunAnim:
case IsleScript::c_pho106re_RunAnim: case IsleScript::c_pho106re_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 6500; m_duration = 6500;
break; break;
} }
@ -376,8 +376,8 @@ MxResult Pizza::Tickle()
{ {
MxLong time = Timer()->GetTime(); MxLong time = Timer()->GetTime();
if (m_unk0x90 != INT_MIN && m_unk0x94 + m_unk0x90 <= time) { if (m_startTime != INT_MIN && m_duration + m_startTime <= time) {
m_unk0x90 = INT_MIN; m_startTime = INT_MIN;
m_skateBoard->EnableScenePresentation(FALSE); m_skateBoard->EnableScenePresentation(FALSE);
m_skateBoard->SetPizzaVisible(FALSE); m_skateBoard->SetPizzaVisible(FALSE);
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
@ -395,29 +395,29 @@ MxResult Pizza::Tickle()
InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_Avo917In_PlayWav, NULL); InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_Avo917In_PlayWav, NULL);
MxTrace("Pizza mission: timeout, stop\n"); MxTrace("Pizza mission: timeout, stop\n");
} }
else if (time >= m_mission->m_startTime + 35000 && m_unk0x8c == IsleScript::c_noneIsle) { else if (time >= m_mission->m_startTime + 35000 && m_speechAction == IsleScript::c_noneIsle) {
switch (GameState()->GetActorId()) { switch (GameState()->GetActorId()) {
case LegoActor::c_pepper: case LegoActor::c_pepper:
m_unk0x8c = IsleScript::c_Avo914In_PlayWav; m_speechAction = IsleScript::c_Avo914In_PlayWav;
break; break;
case LegoActor::c_mama: case LegoActor::c_mama:
m_unk0x8c = IsleScript::c_Avo910In_PlayWav; m_speechAction = IsleScript::c_Avo910In_PlayWav;
break; break;
case LegoActor::c_papa: case LegoActor::c_papa:
m_unk0x8c = IsleScript::c_Avo912In_PlayWav; m_speechAction = IsleScript::c_Avo912In_PlayWav;
break; break;
case LegoActor::c_nick: case LegoActor::c_nick:
m_unk0x8c = IsleScript::c_Avo911In_PlayWav; m_speechAction = IsleScript::c_Avo911In_PlayWav;
break; break;
case LegoActor::c_laura: case LegoActor::c_laura:
m_unk0x8c = IsleScript::c_Avo913In_PlayWav; m_speechAction = IsleScript::c_Avo913In_PlayWav;
break; break;
} }
BackgroundAudioManager()->LowerVolume(); BackgroundAudioManager()->LowerVolume();
if (m_unk0x8c != IsleScript::c_noneIsle) { if (m_speechAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_start, *g_isleScript, m_unk0x8c, NULL); InvokeAction(Extra::e_start, *g_isleScript, m_speechAction, NULL);
} }
} }
} }
@ -447,14 +447,14 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
MxLong result = 0; MxLong result = 0;
MxU32 objectId = p_param.GetAction()->GetObjectId(); MxU32 objectId = p_param.GetAction()->GetObjectId();
if (m_unk0x8c == objectId) { if (m_speechAction == objectId) {
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
return 1; return 1;
} }
switch (m_state->m_unk0x0c) { switch (m_state->m_unk0x0c) {
case 1: case 1:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
m_state->m_unk0x0c = 2; m_state->m_unk0x0c = 2;
m_mission->m_startTime = Timer()->GetTime(); m_mission->m_startTime = Timer()->GetTime();
TickleManager()->RegisterClient(this, 200); TickleManager()->RegisterClient(this, 200);
@ -462,7 +462,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
break; break;
case 3: case 3:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
m_mission->m_startTime = Timer()->GetTime(); m_mission->m_startTime = Timer()->GetTime();
PizzaMissionState::Mission* mission = m_mission; PizzaMissionState::Mission* mission = m_mission;
@ -471,7 +471,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
m_state->m_unk0x0c = 4; m_state->m_unk0x0c = 4;
m_state->SetUnknown0xb0(IsleScript::c_noneIsle); m_state->SetPlayedAction(IsleScript::c_noneIsle);
UserActor()->SetActorState(LegoPathActor::c_initial); UserActor()->SetActorState(LegoPathActor::c_initial);
m_skateBoard->SetPizzaVisible(TRUE); m_skateBoard->SetPizzaVisible(TRUE);
m_world->PlaceActor(m_skateBoard, "int37", 2, 0.5, 3, 0.5); m_world->PlaceActor(m_skateBoard, "int37", 2, 0.5, 3, 0.5);
@ -490,7 +490,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
break; break;
case 5: case 5:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
StopActions(); StopActions();
if (GameState()->GetActorId() == LegoActor::c_pepper) { if (GameState()->GetActorId() == LegoActor::c_pepper) {
@ -506,24 +506,24 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
break; break;
case 2: case 2:
action = IsleScript::c_pja129br_RunAnim; action = IsleScript::c_pja129br_RunAnim;
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 500; m_duration = 500;
m_mission->m_unk0x14++; m_mission->m_unk0x14++;
m_state->m_unk0x0c = 6; m_state->m_unk0x0c = 6;
MxTrace("Pizza mission: succeeds\n"); MxTrace("Pizza mission: succeeds\n");
break; break;
case 3: case 3:
action = IsleScript::c_pja131br_RunAnim; action = IsleScript::c_pja131br_RunAnim;
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 500; m_duration = 500;
m_state->m_unk0x0c = 6; m_state->m_unk0x0c = 6;
break; break;
} }
} }
else { else {
action = IsleScript::c_pja132br_RunAnim; action = IsleScript::c_pja132br_RunAnim;
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 2300; m_duration = 2300;
m_state->m_unk0x0c = 8; m_state->m_unk0x0c = 8;
InputManager()->DisableInputProcessing(); InputManager()->DisableInputProcessing();
InputManager()->SetUnknown336(TRUE); InputManager()->SetUnknown336(TRUE);
@ -535,16 +535,16 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
else { else {
FUN_100382b0(); FUN_100382b0();
m_state->m_unk0x0c = 0; m_state->m_unk0x0c = 0;
m_state->SetUnknown0xb0(IsleScript::c_noneIsle); m_state->SetPlayedAction(IsleScript::c_noneIsle);
} }
} }
break; break;
case 6: case 6:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
if (objectId == IsleScript::c_pja126br_RunAnim) { if (objectId == IsleScript::c_pja126br_RunAnim) {
PlayAction(IsleScript::c_pja127br_RunAnim, TRUE); PlayAction(IsleScript::c_pja127br_RunAnim, TRUE);
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 700; m_duration = 700;
} }
else if (objectId == IsleScript::c_pja129br_RunAnim) { else if (objectId == IsleScript::c_pja129br_RunAnim) {
PlayAction(IsleScript::c_pja130br_RunAnim, TRUE); PlayAction(IsleScript::c_pja130br_RunAnim, TRUE);
@ -552,12 +552,12 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
else { else {
FUN_100382b0(); FUN_100382b0();
m_state->m_unk0x0c = 0; m_state->m_unk0x0c = 0;
m_state->SetUnknown0xb0(IsleScript::c_noneIsle); m_state->SetPlayedAction(IsleScript::c_noneIsle);
} }
} }
break; break;
case 8: case 8:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
m_act1state->m_unk0x018 = 0; m_act1state->m_unk0x018 = 0;
m_state->m_unk0x0c = 0; m_state->m_unk0x0c = 0;
GameState()->m_currentArea = LegoGameState::e_isle; GameState()->m_currentArea = LegoGameState::e_isle;
@ -567,7 +567,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
break; break;
case 9: case 9:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
FUN_100382b0(); FUN_100382b0();
} }
break; break;
@ -580,10 +580,10 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
// FUNCTION: BETA10 0x100ef520 // FUNCTION: BETA10 0x100ef520
void Pizza::PlayAction(MxU32 p_objectId, MxBool p_param7) void Pizza::PlayAction(MxU32 p_objectId, MxBool p_param7)
{ {
m_state->SetUnknown0xb0(p_objectId); m_state->SetPlayedAction(p_objectId);
if (m_unk0x8c != IsleScript::c_noneIsle) { if (m_speechAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x8c, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_speechAction, NULL);
} }
AnimationManager() AnimationManager()
@ -601,7 +601,7 @@ PizzaMissionState::PizzaMissionState()
m_missions[3] = Mission(LegoActor::c_nick, 2, g_nickFinishTimes, g_nickActions, 4); m_missions[3] = Mission(LegoActor::c_nick, 2, g_nickFinishTimes, g_nickActions, 4);
m_missions[4] = Mission(LegoActor::c_laura, 2, g_lauraFinishTimes, g_lauraActions, 4); m_missions[4] = Mission(LegoActor::c_laura, 2, g_lauraFinishTimes, g_lauraActions, 4);
m_pizzeriaState = (PizzeriaState*) GameState()->GetState("PizzeriaState"); m_pizzeriaState = (PizzeriaState*) GameState()->GetState("PizzeriaState");
m_unk0xb0 = IsleScript::c_noneIsle; m_playedAction = IsleScript::c_noneIsle;
} }
// FUNCTION: LEGO1 0x100393c0 // FUNCTION: LEGO1 0x100393c0
@ -645,7 +645,7 @@ PizzaMissionState::Mission* PizzaMissionState::GetMission(MxU8 p_actorId)
} }
// FUNCTION: LEGO1 0x10039540 // FUNCTION: LEGO1 0x10039540
MxS16 PizzaMissionState::FUN_10039540() MxS16 PizzaMissionState::GetActorState()
{ {
return m_pizzeriaState->FUN_10017d50(); return m_pizzeriaState->GetActorState();
} }

View File

@ -69,7 +69,7 @@ void Pizzeria::CreateState()
// FUNCTION: BETA10 0x100efc91 // FUNCTION: BETA10 0x100efc91
MxLong Pizzeria::HandleClick() MxLong Pizzeria::HandleClick()
{ {
if (FUN_1003ef60() && m_pizzaMissionState->m_unk0x0c == 0) { if (CanExit() && m_pizzaMissionState->m_unk0x0c == 0) {
if (UserActor()->GetActorId() != GameState()->GetActorId()) { if (UserActor()->GetActorId() != GameState()->GetActorId()) {
if (!UserActor()->IsA("SkateBoard")) { if (!UserActor()->IsA("SkateBoard")) {
((IslePathActor*) UserActor())->Exit(); ((IslePathActor*) UserActor())->Exit();
@ -89,18 +89,18 @@ MxLong Pizzeria::HandleClick()
// FUNCTION: BETA10 0x100efd14 // FUNCTION: BETA10 0x100efd14
PizzeriaState::PizzeriaState() PizzeriaState::PizzeriaState()
{ {
m_unk0x08[0] = Playlist((MxU32*) g_pepperActions, sizeOfArray(g_pepperActions), Playlist::e_once); m_playerPlaylists[0] = Playlist((MxU32*) g_pepperActions, sizeOfArray(g_pepperActions), Playlist::e_once);
m_unk0x08[1] = Playlist((MxU32*) g_mamaActions, sizeOfArray(g_mamaActions), Playlist::e_once); m_playerPlaylists[1] = Playlist((MxU32*) g_mamaActions, sizeOfArray(g_mamaActions), Playlist::e_once);
m_unk0x08[2] = Playlist((MxU32*) g_papaActions, sizeOfArray(g_papaActions), Playlist::e_once); m_playerPlaylists[2] = Playlist((MxU32*) g_papaActions, sizeOfArray(g_papaActions), Playlist::e_once);
m_unk0x08[3] = Playlist((MxU32*) g_nickActions, sizeOfArray(g_nickActions), Playlist::e_once); m_playerPlaylists[3] = Playlist((MxU32*) g_nickActions, sizeOfArray(g_nickActions), Playlist::e_once);
m_unk0x08[4] = Playlist((MxU32*) g_lauraActions, sizeOfArray(g_lauraActions), Playlist::e_once); m_playerPlaylists[4] = Playlist((MxU32*) g_lauraActions, sizeOfArray(g_lauraActions), Playlist::e_once);
memset(m_unk0x44, -1, sizeof(m_unk0x44)); memset(m_states, -1, sizeof(m_states));
} }
// FUNCTION: LEGO1 0x10017d50 // FUNCTION: LEGO1 0x10017d50
MxS16 PizzeriaState::FUN_10017d50() MxS16 PizzeriaState::GetActorState()
{ {
return m_unk0x44[GameState()->GetActorId() - 1]; return m_states[GameState()->GetActorId() - 1];
} }
// FUNCTION: LEGO1 0x10017d70 // FUNCTION: LEGO1 0x10017d70
@ -109,11 +109,11 @@ MxU32 PizzeriaState::NextAction()
{ {
MxU8 actorId = GameState()->GetActorId(); MxU8 actorId = GameState()->GetActorId();
if (m_unk0x44[actorId - 1] < 2) { if (m_states[actorId - 1] < 2) {
m_unk0x44[actorId - 1]++; m_states[actorId - 1]++;
} }
return m_unk0x08[actorId - 1].Next(); return m_playerPlaylists[actorId - 1].Next();
} }
// FUNCTION: LEGO1 0x10017da0 // FUNCTION: LEGO1 0x10017da0
@ -124,12 +124,12 @@ MxResult PizzeriaState::Serialize(LegoStorage* p_storage)
if (p_storage->IsReadMode()) { if (p_storage->IsReadMode()) {
for (MxS16 i = 0; i < 5; i++) { for (MxS16 i = 0; i < 5; i++) {
p_storage->ReadS16(m_unk0x08[i].m_nextIndex); p_storage->ReadS16(m_playerPlaylists[i].m_nextIndex);
} }
} }
else { else {
for (MxS16 i = 0; i < 5; i++) { for (MxS16 i = 0; i < 5; i++) {
p_storage->WriteS16(m_unk0x08[i].m_nextIndex); p_storage->WriteS16(m_playerPlaylists[i].m_nextIndex);
} }
} }

View File

@ -40,7 +40,7 @@ MxResult RaceCar::Create(MxDSAction& p_dsAction)
// FUNCTION: LEGO1 0x100284d0 // FUNCTION: LEGO1 0x100284d0
MxLong RaceCar::HandleClick() MxLong RaceCar::HandleClick()
{ {
if (!FUN_1003ef60()) { if (!CanExit()) {
return 1; return 1;
} }

View File

@ -18,7 +18,7 @@ DECOMP_SIZE_ASSERT(Radio, 0x10)
DECOMP_SIZE_ASSERT(RadioState, 0x30) DECOMP_SIZE_ASSERT(RadioState, 0x30)
// GLOBAL: LEGO1 0x100f3218 // GLOBAL: LEGO1 0x100f3218
JukeboxScript::Script g_unk0x100f3218[] = { JukeboxScript::Script g_jingles[] = {
JukeboxScript::c_sns002ra_Audio, JukeboxScript::c_sns002ra_Audio,
JukeboxScript::c_sns001ja_Audio, JukeboxScript::c_sns001ja_Audio,
JukeboxScript::c_snsc01js_Audio, JukeboxScript::c_snsc01js_Audio,
@ -28,7 +28,7 @@ JukeboxScript::Script g_unk0x100f3218[] = {
}; };
// GLOBAL: LEGO1 0x100f3230 // GLOBAL: LEGO1 0x100f3230
JukeboxScript::Script g_unk0x100f3230[] = { JukeboxScript::Script g_news[] = {
JukeboxScript::c_ham035ra_Audio, JukeboxScript::c_ham035ra_Audio,
JukeboxScript::c_ham039ra_Audio, JukeboxScript::c_ham039ra_Audio,
JukeboxScript::c_sns005ra_Audio, JukeboxScript::c_sns005ra_Audio,
@ -46,7 +46,7 @@ JukeboxScript::Script g_unk0x100f3230[] = {
}; };
// GLOBAL: LEGO1 0x100f3268 // GLOBAL: LEGO1 0x100f3268
JukeboxScript::Script g_unk0x100f3268[] = { JukeboxScript::Script g_songs[] = {
JukeboxScript::c_CentralRoads_Music, JukeboxScript::c_CentralRoads_Music,
JukeboxScript::c_BeachBlvd_Music, JukeboxScript::c_BeachBlvd_Music,
JukeboxScript::c_ResidentalArea_Music, JukeboxScript::c_ResidentalArea_Music,
@ -64,7 +64,7 @@ Radio::Radio()
NotificationManager()->Register(this); NotificationManager()->Register(this);
ControlManager()->Register(this); ControlManager()->Register(this);
m_unk0x0c = TRUE; m_enabled = TRUE;
CreateState(); CreateState();
} }
@ -86,7 +86,7 @@ MxLong Radio::Notify(MxParam& p_param)
{ {
MxLong result = 0; MxLong result = 0;
if (m_unk0x0c) { if (m_enabled) {
MxNotificationParam& param = (MxNotificationParam&) p_param; MxNotificationParam& param = (MxNotificationParam&) p_param;
switch (param.GetNotification()) { switch (param.GetNotification()) {
case c_notificationEndAction: case c_notificationEndAction:
@ -108,7 +108,7 @@ void Radio::Play()
CurrentWorld(); CurrentWorld();
MxDSAction action; MxDSAction action;
action.SetObjectId(m_state->FUN_1002d090()); action.SetObjectId(m_state->NextPlaylistObjectId());
action.SetAtomId(*g_jukeboxScript); action.SetAtomId(*g_jukeboxScript);
action.SetLoopCount(1); action.SetLoopCount(1);
@ -131,7 +131,7 @@ void Radio::Stop()
MxControlPresenter* presenter = (MxControlPresenter*) world->Find(world->GetAtomId(), IsleScript::c_Radio_Ctl); MxControlPresenter* presenter = (MxControlPresenter*) world->Find(world->GetAtomId(), IsleScript::c_Radio_Ctl);
if (presenter) { if (presenter) {
presenter->VTable0x6c(0); presenter->UpdateEnabledChild(0);
} }
BackgroundAudioManager()->Stop(); BackgroundAudioManager()->Stop();
@ -174,11 +174,11 @@ MxLong Radio::HandleControl(LegoControlManagerNotificationParam& p_param)
MxLong Radio::HandleEndAction(MxEndActionNotificationParam& p_param) MxLong Radio::HandleEndAction(MxEndActionNotificationParam& p_param)
{ {
if (m_state->IsActive() && if (m_state->IsActive() &&
m_state->FUN_1002d0c0(p_param.GetAction()->GetAtomId(), p_param.GetAction()->GetObjectId())) { m_state->IsRadioObjectId(p_param.GetAction()->GetAtomId(), p_param.GetAction()->GetObjectId())) {
MxDSAction action; MxDSAction action;
action.SetAtomId(*g_jukeboxScript); action.SetAtomId(*g_jukeboxScript);
action.SetObjectId(m_state->FUN_1002d090()); action.SetObjectId(m_state->NextPlaylistObjectId());
action.SetLoopCount(1); action.SetLoopCount(1);
BackgroundAudioManager()->PlayMusic(action, 3, MxPresenter::e_repeating); BackgroundAudioManager()->PlayMusic(action, 3, MxPresenter::e_repeating);
@ -191,8 +191,8 @@ MxLong Radio::HandleEndAction(MxEndActionNotificationParam& p_param)
// FUNCTION: LEGO1 0x1002cdc0 // FUNCTION: LEGO1 0x1002cdc0
void Radio::Initialize(MxBool p_und) void Radio::Initialize(MxBool p_und)
{ {
if (m_unk0x0c != p_und) { if (m_enabled != p_und) {
m_unk0x0c = p_und; m_enabled = p_und;
CreateState(); CreateState();
} }
} }
@ -216,39 +216,39 @@ RadioState::RadioState()
srand(Timer()->GetTime()); srand(Timer()->GetTime());
MxS32 random = rand(); MxS32 random = rand();
m_unk0x2c = random % 3; m_activePlaylist = random % 3;
m_unk0x08[0] = Playlist((MxU32*) g_unk0x100f3218, sizeOfArray(g_unk0x100f3218), Playlist::e_loop); m_playlists[0] = Playlist((MxU32*) g_jingles, sizeOfArray(g_jingles), Playlist::e_loop);
m_unk0x08[0].m_nextIndex = (rand() % sizeOfArray(g_unk0x100f3218)); m_playlists[0].m_nextIndex = (rand() % sizeOfArray(g_jingles));
m_unk0x08[1] = Playlist((MxU32*) g_unk0x100f3230, sizeOfArray(g_unk0x100f3230), Playlist::e_loop); m_playlists[1] = Playlist((MxU32*) g_news, sizeOfArray(g_news), Playlist::e_loop);
m_unk0x08[1].m_nextIndex = (rand() % sizeOfArray(g_unk0x100f3230)); m_playlists[1].m_nextIndex = (rand() % sizeOfArray(g_news));
m_unk0x08[2] = Playlist((MxU32*) g_unk0x100f3268, sizeOfArray(g_unk0x100f3268), Playlist::e_loop); m_playlists[2] = Playlist((MxU32*) g_songs, sizeOfArray(g_songs), Playlist::e_loop);
m_unk0x08[2].m_nextIndex = (rand() % sizeOfArray(g_unk0x100f3268)); m_playlists[2].m_nextIndex = (rand() % sizeOfArray(g_songs));
m_active = FALSE; m_active = FALSE;
} }
// FUNCTION: LEGO1 0x1002d090 // FUNCTION: LEGO1 0x1002d090
MxU32 RadioState::FUN_1002d090() MxU32 RadioState::NextPlaylistObjectId()
{ {
if (m_unk0x2c == 2) { if (m_activePlaylist == 2) {
m_unk0x2c = 0; m_activePlaylist = 0;
} }
else { else {
m_unk0x2c++; m_activePlaylist++;
} }
return m_unk0x08[m_unk0x2c].Next(); return m_playlists[m_activePlaylist].Next();
} }
// FUNCTION: LEGO1 0x1002d0c0 // FUNCTION: LEGO1 0x1002d0c0
MxBool RadioState::FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId) MxBool RadioState::IsRadioObjectId(const MxAtomId& p_atom, MxU32 p_objectId)
{ {
if (*g_jukeboxScript == p_atom) { if (*g_jukeboxScript == p_atom) {
for (MxS16 i = 0; i < 3; i++) { for (MxS16 i = 0; i < 3; i++) {
if (m_unk0x08[i].Contains(p_objectId)) { if (m_playlists[i].Contains(p_objectId)) {
return TRUE; return TRUE;
} }
} }

View File

@ -75,7 +75,7 @@ MxLong SkateBoard::HandleClick()
{ {
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
if (!FUN_1003ef60() && state->m_unk0x018 != 3) { if (!CanExit() && state->m_unk0x018 != 3) {
return 1; return 1;
} }
@ -112,7 +112,7 @@ MxLong SkateBoard::HandleControl(LegoControlManagerNotificationParam& p_param)
if (p_param.m_unk0x28 == 1 && p_param.m_clickedObjectId == IsleScript::c_SkateArms_Ctl) { if (p_param.m_unk0x28 == 1 && p_param.m_clickedObjectId == IsleScript::c_SkateArms_Ctl) {
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::Area::e_unk66; GameState()->m_currentArea = LegoGameState::Area::e_vehicleExited;
result = 1; result = 1;
} }

View File

@ -435,7 +435,7 @@ MxLong TowTrack::HandleClick()
FindROI("rcred")->SetVisibility(FALSE); FindROI("rcred")->SetVisibility(FALSE);
} }
else { else {
SpawnPlayer(LegoGameState::e_unk28, TRUE, 0); SpawnPlayer(LegoGameState::e_garageExited, TRUE, 0);
m_lastAction = IsleScript::c_noneIsle; m_lastAction = IsleScript::c_noneIsle;
m_lastAnimation = IsleScript::c_noneIsle; m_lastAnimation = IsleScript::c_noneIsle;
m_state->m_startTime = Timer()->GetTime(); m_state->m_startTime = Timer()->GetTime();
@ -486,14 +486,14 @@ MxLong TowTrack::HandleControl(LegoControlManagerNotificationParam& p_param)
switch (p_param.m_clickedObjectId) { switch (p_param.m_clickedObjectId) {
case IsleScript::c_TowTrackArms_Ctl: case IsleScript::c_TowTrackArms_Ctl:
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_TowInfo_Ctl: case IsleScript::c_TowInfo_Ctl:
((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain); ((Isle*) CurrentWorld())->SetDestLocation(LegoGameState::e_infomain);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
Exit(); Exit();
GameState()->m_currentArea = LegoGameState::e_unk66; GameState()->m_currentArea = LegoGameState::e_vehicleExited;
result = 1; result = 1;
break; break;
case IsleScript::c_TowHorn_Ctl: case IsleScript::c_TowHorn_Ctl:

View File

@ -3,7 +3,6 @@
#include "legomain.h" #include "legomain.h"
#include "misc.h" #include "misc.h"
#include "mxaudiopresenter.h" #include "mxaudiopresenter.h"
#include "mxcompositepresenter.h"
#include "mxdssound.h" #include "mxdssound.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxnotificationmanager.h" #include "mxnotificationmanager.h"
@ -11,6 +10,7 @@
#include "mxstreamer.h" #include "mxstreamer.h"
#include "mxticklemanager.h" #include "mxticklemanager.h"
#include "mxutilities.h" #include "mxutilities.h"
#include "mxwavepresenter.h"
DECOMP_SIZE_ASSERT(MxBackgroundAudioManager, 0x150) DECOMP_SIZE_ASSERT(MxBackgroundAudioManager, 0x150)
@ -18,12 +18,12 @@ DECOMP_SIZE_ASSERT(MxBackgroundAudioManager, 0x150)
MxBackgroundAudioManager::MxBackgroundAudioManager() MxBackgroundAudioManager::MxBackgroundAudioManager()
{ {
NotificationManager()->Register(this); NotificationManager()->Register(this);
m_unk0xa0 = 0; m_activePresenter = NULL;
m_unk0x138 = 0; m_pendingPresenter = NULL;
m_tickleState = MxPresenter::e_idle; m_tickleState = MxPresenter::e_idle;
m_speed = 0; m_speed = 0;
m_targetVolume = 0; m_targetVolume = 0;
m_unk0x148 = 0; m_volumeSuppressionAmount = 0;
m_enabled = FALSE; m_enabled = FALSE;
} }
@ -83,29 +83,29 @@ MxResult MxBackgroundAudioManager::Tickle()
{ {
switch (m_tickleState) { switch (m_tickleState) {
case MxPresenter::e_starting: case MxPresenter::e_starting:
FadeInOrFadeOut(); FadeToTargetVolume();
break; break;
case MxPresenter::e_streaming: case MxPresenter::e_streaming:
FUN_1007ee70(); MakePendingPresenterActive();
break; break;
case MxPresenter::e_repeating: case MxPresenter::e_repeating:
FUN_1007ef40(); FadeInPendingPresenter();
} }
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x1007ee70 // FUNCTION: LEGO1 0x1007ee70
void MxBackgroundAudioManager::FUN_1007ee70() void MxBackgroundAudioManager::MakePendingPresenterActive()
{ {
if (m_unk0xa0 && m_unk0xa0->GetAction()) { if (m_activePresenter && m_activePresenter->GetAction()) {
DeleteObject(*m_unk0x138->GetAction()); DeleteObject(*m_pendingPresenter->GetAction());
} }
if (m_unk0x138) { if (m_pendingPresenter) {
m_unk0xa0 = m_unk0x138; m_activePresenter = m_pendingPresenter;
m_action1 = m_action2; m_action1 = m_action2;
m_unk0x138 = NULL; m_pendingPresenter = NULL;
m_action2.SetObjectId(-1); m_action2.SetObjectId(-1);
m_action2.SetAtomId(MxAtomId()); m_action2.SetAtomId(MxAtomId());
m_tickleState = MxPresenter::e_idle; m_tickleState = MxPresenter::e_idle;
@ -113,65 +113,65 @@ void MxBackgroundAudioManager::FUN_1007ee70()
} }
// FUNCTION: LEGO1 0x1007ef40 // FUNCTION: LEGO1 0x1007ef40
void MxBackgroundAudioManager::FUN_1007ef40() void MxBackgroundAudioManager::FadeInPendingPresenter()
{ {
MxS32 compare, volume; MxS32 compare, volume;
if (m_unk0xa0 == NULL) { if (m_activePresenter == NULL) {
if (m_unk0x138) { if (m_pendingPresenter) {
if (m_unk0x148 != 0) { if (m_volumeSuppressionAmount != 0) {
compare = 30; compare = 30;
} }
else { else {
compare = m_targetVolume; compare = m_targetVolume;
} }
volume = m_unk0x138->GetVolume(); volume = m_pendingPresenter->GetVolume();
if (volume < compare) { if (volume < compare) {
if (m_speed + m_unk0x138->GetVolume() <= compare) { if (m_speed + m_pendingPresenter->GetVolume() <= compare) {
compare = m_speed + m_unk0x138->GetVolume(); compare = m_speed + m_pendingPresenter->GetVolume();
} }
m_unk0x138->SetVolume(compare); m_pendingPresenter->SetVolume(compare);
} }
else { else {
m_unk0x138->SetVolume(compare); m_pendingPresenter->SetVolume(compare);
m_unk0xa0 = m_unk0x138; m_activePresenter = m_pendingPresenter;
m_action1 = m_action2; m_action1 = m_action2;
m_unk0x138 = NULL; m_pendingPresenter = NULL;
m_action2.SetObjectId(-1); m_action2.SetObjectId(-1);
m_action2.SetAtomId(MxAtomId()); m_action2.SetAtomId(MxAtomId());
m_tickleState = MxPresenter::e_idle; m_tickleState = MxPresenter::e_idle;
} }
} }
} }
else if (m_unk0xa0->GetAction() != NULL) { else if (m_activePresenter->GetAction() != NULL) {
if (m_unk0xa0->GetVolume() == 0) { if (m_activePresenter->GetVolume() == 0) {
DeleteObject(*m_unk0xa0->GetAction()); DeleteObject(*m_activePresenter->GetAction());
} }
else { else {
if (m_unk0xa0->GetVolume() - m_speed > 0) { if (m_activePresenter->GetVolume() - m_speed > 0) {
volume = m_unk0xa0->GetVolume() - m_speed; volume = m_activePresenter->GetVolume() - m_speed;
} }
else { else {
volume = 0; volume = 0;
} }
m_unk0xa0->SetVolume(volume); m_activePresenter->SetVolume(volume);
} }
} }
} }
// FUNCTION: LEGO1 0x1007f0e0 // FUNCTION: LEGO1 0x1007f0e0
// FUNCTION: BETA10 0x100e8d8d // FUNCTION: BETA10 0x100e8d8d
void MxBackgroundAudioManager::FadeInOrFadeOut() void MxBackgroundAudioManager::FadeToTargetVolume()
{ {
MxS32 volume, compare; MxS32 volume, compare;
if (m_unk0xa0 != NULL) { if (m_activePresenter != NULL) {
volume = m_unk0xa0->GetVolume(); volume = m_activePresenter->GetVolume();
if (m_unk0x148 != 0) { if (m_volumeSuppressionAmount != 0) {
compare = 30; compare = 30;
} }
else { else {
@ -179,13 +179,13 @@ void MxBackgroundAudioManager::FadeInOrFadeOut()
} }
if (volume < compare) { if (volume < compare) {
m_unk0xa0->SetVolume(volume + m_speed < compare ? volume + m_speed : compare); m_activePresenter->SetVolume(volume + m_speed < compare ? volume + m_speed : compare);
} }
else if (compare < volume) { else if (compare < volume) {
m_unk0xa0->SetVolume(volume - m_speed > compare ? volume - m_speed : compare); m_activePresenter->SetVolume(volume - m_speed > compare ? volume - m_speed : compare);
} }
else { else {
m_unk0xa0->SetVolume(volume); m_activePresenter->SetVolume(volume);
m_tickleState = MxPresenter::e_idle; m_tickleState = MxPresenter::e_idle;
} }
} }
@ -215,23 +215,23 @@ MxLong MxBackgroundAudioManager::Notify(MxParam& p_param)
void MxBackgroundAudioManager::StartAction(MxParam& p_param) void MxBackgroundAudioManager::StartAction(MxParam& p_param)
{ {
// TODO: the sender is most likely a MxAudioPresenter? // TODO: the sender is most likely a MxAudioPresenter?
m_unk0x138 = (MxAudioPresenter*) ((MxNotificationParam&) p_param).GetSender(); m_pendingPresenter = (MxAudioPresenter*) ((MxNotificationParam&) p_param).GetSender();
m_action2.SetAtomId(m_unk0x138->GetAction()->GetAtomId()); m_action2.SetAtomId(m_pendingPresenter->GetAction()->GetAtomId());
m_action2.SetObjectId(m_unk0x138->GetAction()->GetObjectId()); m_action2.SetObjectId(m_pendingPresenter->GetAction()->GetObjectId());
m_targetVolume = ((MxDSSound*) (m_unk0x138->GetAction()))->GetVolume(); m_targetVolume = ((MxDSSound*) (m_pendingPresenter->GetAction()))->GetVolume();
m_unk0x138->SetVolume(0); m_pendingPresenter->SetVolume(0);
} }
// FUNCTION: LEGO1 0x1007f200 // FUNCTION: LEGO1 0x1007f200
void MxBackgroundAudioManager::StopAction(MxParam& p_param) void MxBackgroundAudioManager::StopAction(MxParam& p_param)
{ {
if (((MxNotificationParam&) p_param).GetSender() == m_unk0xa0) { if (((MxNotificationParam&) p_param).GetSender() == m_activePresenter) {
m_unk0xa0 = NULL; m_activePresenter = NULL;
m_action1.SetAtomId(MxAtomId()); m_action1.SetAtomId(MxAtomId());
m_action1.SetObjectId(-1); m_action1.SetObjectId(-1);
} }
else if (((MxNotificationParam&) p_param).GetSender() == m_unk0x138) { else if (((MxNotificationParam&) p_param).GetSender() == m_pendingPresenter) {
m_unk0x138 = NULL; m_pendingPresenter = NULL;
m_action2.SetAtomId(MxAtomId()); m_action2.SetAtomId(MxAtomId());
m_action2.SetObjectId(-1); m_action2.SetObjectId(-1);
} }
@ -243,7 +243,7 @@ void MxBackgroundAudioManager::StopAction(MxParam& p_param)
// FUNCTION: BETA10 0x100e90fc // FUNCTION: BETA10 0x100e90fc
MxResult MxBackgroundAudioManager::PlayMusic( MxResult MxBackgroundAudioManager::PlayMusic(
MxDSAction& p_action, MxDSAction& p_action,
undefined4 p_speed, MxS32 p_speed,
MxPresenter::TickleState p_tickleState MxPresenter::TickleState p_tickleState
) )
{ {
@ -261,7 +261,7 @@ MxResult MxBackgroundAudioManager::PlayMusic(
m_action2.SetAtomId(p_action.GetAtomId()); m_action2.SetAtomId(p_action.GetAtomId());
m_action2.SetObjectId(p_action.GetObjectId()); m_action2.SetObjectId(p_action.GetObjectId());
m_action2.SetUnknown84(this); m_action2.SetNotificationObject(this);
m_action2.SetOrigin(this); m_action2.SetOrigin(this);
MxResult result = Start(&m_action2); MxResult result = Start(&m_action2);
@ -289,7 +289,7 @@ void MxBackgroundAudioManager::Stop()
DeleteObject(m_action2); DeleteObject(m_action2);
} }
m_unk0x138 = 0; m_pendingPresenter = NULL;
m_action2.SetAtomId(MxAtomId()); m_action2.SetAtomId(MxAtomId());
m_action2.SetObjectId(-1); m_action2.SetObjectId(-1);
@ -297,9 +297,9 @@ void MxBackgroundAudioManager::Stop()
DeleteObject(m_action1); DeleteObject(m_action1);
} }
m_unk0xa0 = 0; m_activePresenter = NULL;
m_action1.SetAtomId(MxAtomId()); m_action1.SetAtomId(MxAtomId());
m_unk0x148 = 0; m_volumeSuppressionAmount = 0;
m_action1.SetObjectId(-1); m_action1.SetObjectId(-1);
m_tickleState = MxPresenter::e_idle; m_tickleState = MxPresenter::e_idle;
} }
@ -308,22 +308,22 @@ void MxBackgroundAudioManager::Stop()
// FUNCTION: BETA10 0x100e94e6 // FUNCTION: BETA10 0x100e94e6
void MxBackgroundAudioManager::LowerVolume() void MxBackgroundAudioManager::LowerVolume()
{ {
if (m_unk0x148 == 0) { if (m_volumeSuppressionAmount == 0) {
if (m_tickleState == 0) { if (m_tickleState == 0) {
m_tickleState = MxPresenter::e_starting; m_tickleState = MxPresenter::e_starting;
} }
m_speed = 20; m_speed = 20;
} }
m_unk0x148++; m_volumeSuppressionAmount++;
} }
// FUNCTION: LEGO1 0x1007f5b0 // FUNCTION: LEGO1 0x1007f5b0
// FUNCTION: BETA10 0x100e9543 // FUNCTION: BETA10 0x100e9543
void MxBackgroundAudioManager::RaiseVolume() void MxBackgroundAudioManager::RaiseVolume()
{ {
if (m_unk0x148 != 0) { if (m_volumeSuppressionAmount != 0) {
m_unk0x148--; m_volumeSuppressionAmount--;
if (m_unk0x148 == 0) { if (m_volumeSuppressionAmount == 0) {
if (m_tickleState == 0) { if (m_tickleState == 0) {
m_tickleState = MxPresenter::e_starting; m_tickleState = MxPresenter::e_starting;
} }
@ -346,27 +346,27 @@ void MxBackgroundAudioManager::Enable(MxBool p_enable)
// FUNCTION: LEGO1 0x1007f610 // FUNCTION: LEGO1 0x1007f610
// FUNCTION: BETA10 0x100e95ee // FUNCTION: BETA10 0x100e95ee
undefined4 MxBackgroundAudioManager::FUN_1007f610( MxResult MxBackgroundAudioManager::SetPendingPresenter(
MxPresenter* p_unk0x138, MxPresenter* p_presenter,
MxS32 p_speed, MxS32 p_speed,
MxPresenter::TickleState p_tickleState MxPresenter::TickleState p_tickleState
) )
{ {
m_unk0x138 = (MxAudioPresenter*) p_unk0x138; m_pendingPresenter = (MxAudioPresenter*) p_presenter;
m_targetVolume = ((MxDSSound*) m_unk0x138->GetAction())->GetVolume(); m_targetVolume = ((MxDSSound*) m_pendingPresenter->GetAction())->GetVolume();
((MxCompositePresenter*) m_unk0x138)->VTable0x60(NULL); ((MxWavePresenter*) m_pendingPresenter)->SetVolume(0);
m_speed = p_speed; m_speed = p_speed;
m_tickleState = p_tickleState; m_tickleState = p_tickleState;
return 0; return SUCCESS;
} }
// FUNCTION: LEGO1 0x1007f650 // FUNCTION: LEGO1 0x1007f650
// FUNCTION: BETA10 0x100e9663 // FUNCTION: BETA10 0x100e9663
void MxBackgroundAudioManager::Init() void MxBackgroundAudioManager::Init()
{ {
this->m_unk0xa0 = 0; this->m_activePresenter = NULL;
this->m_tickleState = MxPresenter::e_idle; this->m_tickleState = MxPresenter::e_idle;
} }

View File

@ -93,10 +93,10 @@ MxS16 LegoCarBuild::g_unk0x100f11cc = -1;
LegoCarBuild::LegoCarBuild() LegoCarBuild::LegoCarBuild()
{ {
m_unk0x100 = 0; m_unk0x100 = 0;
m_unk0x110 = 0; m_selectedPart = 0;
m_unk0xf8 = c_unknownminusone; m_unk0xf8 = c_unknownminusone;
m_unk0x2d4 = FALSE; m_selectedPartIsPlaced = FALSE;
m_unk0x258 = 0; m_animPresenter = NULL;
m_ColorBook_Bitmap = NULL; m_ColorBook_Bitmap = NULL;
m_Yellow_Ctl = NULL; m_Yellow_Ctl = NULL;
m_Red_Ctl = NULL; m_Red_Ctl = NULL;
@ -135,12 +135,12 @@ LegoCarBuild::LegoCarBuild()
LegoCarBuild::~LegoCarBuild() LegoCarBuild::~LegoCarBuild()
{ {
m_unk0x100 = 0; m_unk0x100 = 0;
m_unk0x110 = NULL; m_selectedPart = NULL;
if (m_unk0x258) { if (m_animPresenter) {
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_unk0x258->SetTickleState(MxPresenter::e_idle); m_animPresenter->SetTickleState(MxPresenter::e_idle);
m_unk0x258 = NULL; m_animPresenter = NULL;
} }
ControlManager()->Unregister(this); ControlManager()->Unregister(this);
@ -268,7 +268,9 @@ void LegoCarBuild::InitPresenters()
m_Decals_Ctl1 = (MxControlPresenter*) Find("MxControlPresenter", "Decals_Ctl1"); m_Decals_Ctl1 = (MxControlPresenter*) Find("MxControlPresenter", "Decals_Ctl1");
m_Decals_Ctl2 = (MxControlPresenter*) Find("MxControlPresenter", "Decals_Ctl2"); m_Decals_Ctl2 = (MxControlPresenter*) Find("MxControlPresenter", "Decals_Ctl2");
m_Decal_Bitmap = (MxStillPresenter*) Find("MxStillPresenter", "Decal_Bitmap"); m_Decal_Bitmap = (MxStillPresenter*) Find("MxStillPresenter", "Decal_Bitmap");
#ifdef BETA10
assert(m_Decal_Bitmap); assert(m_Decal_Bitmap);
#endif
if (m_Decal_Bitmap) { if (m_Decal_Bitmap) {
m_Decals_Ctl3 = (MxControlPresenter*) Find("MxControlPresenter", "Decals_Ctl3"); m_Decals_Ctl3 = (MxControlPresenter*) Find("MxControlPresenter", "Decals_Ctl3");
assert(m_Decals_Ctl3); assert(m_Decals_Ctl3);
@ -286,9 +288,9 @@ void LegoCarBuild::InitPresenters()
// FUNCTION: LEGO1 0x10022f00 // FUNCTION: LEGO1 0x10022f00
void LegoCarBuild::FUN_10022f00() void LegoCarBuild::FUN_10022f00()
{ {
if (m_unk0x110) { if (m_selectedPart) {
VTable0x6c(); VTable0x6c();
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_unk0x100 = 5; m_unk0x100 = 5;
} }
} }
@ -297,18 +299,18 @@ void LegoCarBuild::FUN_10022f00()
// FUNCTION: BETA10 0x1006b835 // FUNCTION: BETA10 0x1006b835
void LegoCarBuild::FUN_10022f30() void LegoCarBuild::FUN_10022f30()
{ {
if (m_unk0x110) { if (m_selectedPart) {
FUN_10024f70(FALSE); FUN_10024f70(FALSE);
FUN_100250e0(FALSE); FUN_100250e0(FALSE);
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_selectedPart->GetName())) {
m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE); m_PlaceBrick_Sound->Enable(TRUE);
} }
m_unk0x258->SetUnknown0xbc(1); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped);
m_unk0x258->PutFrame(); m_animPresenter->PutFrame();
m_unk0x110 = NULL; m_selectedPart = NULL;
m_unk0x100 = 0; m_unk0x100 = 0;
} }
} }
@ -318,8 +320,8 @@ void LegoCarBuild::FUN_10022f30()
void LegoCarBuild::VTable0x6c() void LegoCarBuild::VTable0x6c()
{ {
m_unk0x178 = m_unk0x1c0; m_unk0x178 = m_unk0x1c0;
m_unk0x110->WrappedSetLocalTransform(m_unk0x178); m_selectedPart->WrappedSetLocal2WorldWithWorldDataUpdate(m_unk0x178);
m_unk0x2a4 = Vector4(m_unk0x110->GetWorldPosition()); m_unk0x2a4 = Vector4(m_selectedPart->GetWorldPosition());
VTable0x70(); VTable0x70();
} }
@ -358,7 +360,7 @@ void LegoCarBuild::VTable0x70()
// FUNCTION: BETA10 0x1006bb22 // FUNCTION: BETA10 0x1006bb22
void LegoCarBuild::FUN_10023130(MxLong p_x, MxLong p_y) void LegoCarBuild::FUN_10023130(MxLong p_x, MxLong p_y)
{ {
if (m_unk0x110) { if (m_selectedPart) {
MxFloat pfVar3[2]; MxFloat pfVar3[2];
MxFloat local30[3]; MxFloat local30[3];
MxFloat local84[3]; MxFloat local84[3];
@ -369,7 +371,7 @@ void LegoCarBuild::FUN_10023130(MxLong p_x, MxLong p_y)
pfVar3[0] = p_x; pfVar3[0] = p_x;
pfVar3[1] = p_y; pfVar3[1] = p_y;
if (FUN_1003ded0(pfVar3, local30, local84)) { if (CalculateRayOriginDirection(pfVar3, local30, local84)) {
MxFloat local18[3]; MxFloat local18[3];
MxFloat local8c[2]; MxFloat local8c[2];
@ -406,7 +408,7 @@ void LegoCarBuild::FUN_10023130(MxLong p_x, MxLong p_y)
local78[3][2] = m_unk0x178[3][2] + local18[2]; local78[3][2] = m_unk0x178[3][2] + local18[2];
local78[3][3] = 1.0; local78[3][3] = 1.0;
m_unk0x110->WrappedSetLocalTransform(local78); m_selectedPart->WrappedSetLocal2WorldWithWorldDataUpdate(local78);
} }
} }
} }
@ -419,7 +421,7 @@ void LegoCarBuild::VTable0x74(MxFloat p_param1[2], MxFloat p_param2[3])
MxFloat local20[3]; MxFloat local20[3];
MxFloat local14[3]; MxFloat local14[3];
FUN_1003ded0(p_param1, local14, local20); CalculateRayOriginDirection(p_param1, local14, local20);
fVar1 = (m_unk0x2a4[2] - local20[2]) / local14[2]; fVar1 = (m_unk0x2a4[2] - local20[2]) / local14[2];
p_param2[0] = (fVar1 * local14[0] + local20[0]) - m_unk0x2a4[0]; p_param2[0] = (fVar1 * local14[0] + local20[0]) - m_unk0x2a4[0];
@ -435,7 +437,7 @@ void LegoCarBuild::VTable0x78(MxFloat p_param1[2], MxFloat p_param2[3])
MxFloat local18[3]; MxFloat local18[3];
MxFloat localc[3]; MxFloat localc[3];
FUN_1003ded0(p_param1, local18, localc); CalculateRayOriginDirection(p_param1, local18, localc);
p_param2[2] = m_unk0x2a4[2] + p_param2[2] = m_unk0x2a4[2] +
(m_unk0x2bc[2] - m_unk0x2a4[2]) * ((p_param1[1] - m_unk0x290[1]) / (m_unk0x298[1] - m_unk0x290[1])); (m_unk0x2bc[2] - m_unk0x2a4[2]) * ((p_param1[1] - m_unk0x290[1]) / (m_unk0x298[1] - m_unk0x290[1]));
@ -451,7 +453,7 @@ void LegoCarBuild::VTable0x7c(MxFloat p_param1[2], MxFloat p_param2[3])
{ {
MxFloat local18[3]; MxFloat local18[3];
MxFloat localc[3]; MxFloat localc[3];
FUN_1003ded0(p_param1, local18, localc); CalculateRayOriginDirection(p_param1, local18, localc);
MxFloat fVar1 = (m_unk0x2bc[1] - localc[1]) / local18[1]; MxFloat fVar1 = (m_unk0x2bc[1] - localc[1]) / local18[1];
p_param2[0] = fVar1 * local18[0] - m_unk0x2a4[0] + localc[0]; p_param2[0] = fVar1 * local18[0] - m_unk0x2a4[0] + localc[0];
@ -472,18 +474,18 @@ void LegoCarBuild::VTable0x80(MxFloat p_param1[2], MxFloat p_param2[2], MxFloat
// FUNCTION: LEGO1 0x100236d0 // FUNCTION: LEGO1 0x100236d0
// FUNCTION: BETA10 0x1006c076 // FUNCTION: BETA10 0x1006c076
void LegoCarBuild::FUN_100236d0() void LegoCarBuild::AddSelectedPartToBuild()
{ {
MxS32 pLVar2; MxS32 pLVar2;
FUN_10024f70(FALSE); FUN_10024f70(FALSE);
FUN_100250e0(FALSE); FUN_100250e0(FALSE);
m_unk0x258->FUN_10079790(m_unk0x110->GetName()); m_animPresenter->AddPartToBuildByName(m_selectedPart->GetName());
m_unk0x258->SetUnknown0xbc(1); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped);
m_unk0x110 = NULL; m_selectedPart = NULL;
m_unk0x100 = 0; m_unk0x100 = 0;
if (m_unk0x258->AllPartsPlaced()) { if (m_animPresenter->AllPartsPlaced()) {
// Note the code duplication with LEGO1 0x10025ee0 // Note the code duplication with LEGO1 0x10025ee0
switch (m_carId) { switch (m_carId) {
case 1: case 1:
@ -539,15 +541,15 @@ MxResult LegoCarBuild::Tickle()
FUN_10024f50(); FUN_10024f50();
} }
if (m_unk0x110) { if (m_selectedPart) {
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_selectedPart->GetName())) {
FUN_10022f30(); FUN_10022f30();
} }
} }
} }
if (m_unk0x100 == 5 && m_unk0x110) { if (m_unk0x100 == 5 && m_selectedPart) {
RotateY(m_unk0x110, g_unk0x100d65a4); RotateY(m_selectedPart, g_unk0x100d65a4);
} }
if (m_unk0x10a) { if (m_unk0x10a) {
@ -654,7 +656,7 @@ MxLong LegoCarBuild::Notify(MxParam& p_param)
if (m_worldStarted) { if (m_worldStarted) {
switch (param.GetNotification()) { switch (param.GetNotification()) {
case c_notificationType0: case c_notificationType0:
FUN_10024c20((LegoEventNotificationParam*) &p_param); FUN_10024c20((MxNotificationParam*) &p_param);
result = 1; result = 1;
break; break;
case c_notificationEndAction: case c_notificationEndAction:
@ -685,7 +687,7 @@ MxLong LegoCarBuild::Notify(MxParam& p_param)
if (((m_buildState->m_animationState != 4) && (m_buildState->m_animationState != 6)) && if (((m_buildState->m_animationState != 4) && (m_buildState->m_animationState != 6)) &&
(m_buildState->m_animationState != 2)) { (m_buildState->m_animationState != 2)) {
m_buildState->m_animationState = LegoVehicleBuildState::e_unknown0; m_buildState->m_animationState = LegoVehicleBuildState::e_unknown0;
result = FUN_100244e0( result = SelectPartFromMousePosition(
((LegoEventNotificationParam&) p_param).GetX(), ((LegoEventNotificationParam&) p_param).GetX(),
((LegoEventNotificationParam&) p_param).GetY() ((LegoEventNotificationParam&) p_param).GetY()
); );
@ -782,11 +784,11 @@ void LegoCarBuild::FUN_100243a0()
TransitionManager()->StartTransition(MxTransitionManager::TransitionType::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::TransitionType::e_mosaic, 50, FALSE, FALSE);
break; break;
case Jetski_Actor: case Jetski_Actor:
m_destLocation = LegoGameState::Area::e_unk17; m_destLocation = LegoGameState::Area::e_jetskibuildExited;
TransitionManager()->StartTransition(MxTransitionManager::TransitionType::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::TransitionType::e_mosaic, 50, FALSE, FALSE);
break; break;
case RaceCar_Actor: case RaceCar_Actor:
m_destLocation = LegoGameState::Area::e_unk20; m_destLocation = LegoGameState::Area::e_racecarbuildExited;
TransitionManager()->StartTransition(MxTransitionManager::TransitionType::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::TransitionType::e_mosaic, 50, FALSE, FALSE);
} }
} }
@ -815,46 +817,46 @@ undefined4 LegoCarBuild::FUN_10024480(MxActionNotificationParam* p_param)
// FUNCTION: LEGO1 0x100244e0 // FUNCTION: LEGO1 0x100244e0
// FUNCTION: BETA10 0x1006cfb6 // FUNCTION: BETA10 0x1006cfb6
undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y) undefined4 LegoCarBuild::SelectPartFromMousePosition(MxLong p_x, MxLong p_y)
{ {
m_unk0x250[0] = p_x; m_unk0x250[0] = p_x;
m_unk0x250[1] = p_y; m_unk0x250[1] = p_y;
LegoROI* roi = PickROI(p_x, p_y); LegoROI* roi = PickROI(p_x, p_y);
if (!roi || !m_unk0x258->StringEndsOnYOrN(roi->GetName())) { if (!roi || !m_animPresenter->StringEndsOnYOrN(roi->GetName())) {
return 0; return 0;
} }
if (m_unk0x110 != roi) { if (m_selectedPart != roi) {
FUN_10022f30(); FUN_10022f30();
m_unk0x110 = roi; m_selectedPart = roi;
FUN_10024f70(TRUE); FUN_10024f70(TRUE);
FUN_100250e0(TRUE); FUN_100250e0(TRUE);
} }
if (m_unk0x100 == 5 && m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_unk0x100 == 5 && m_animPresenter->PartIsPlaced(m_selectedPart->GetName())) {
m_unk0x2d4 = TRUE; m_selectedPartIsPlaced = TRUE;
} }
else { else {
m_unk0x2d4 = FALSE; m_selectedPartIsPlaced = FALSE;
} }
FUN_10025450(); FUN_10025450();
VTable0x70(); VTable0x70();
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_selectedPart->GetName())) {
if (m_unk0x100 != 5) { if (m_unk0x100 != 5) {
m_unk0x250[0] += m_unk0x290[0] - m_unk0x298[0]; m_unk0x250[0] += m_unk0x290[0] - m_unk0x298[0];
m_unk0x250[1] += m_unk0x290[1] - m_unk0x298[1]; m_unk0x250[1] += m_unk0x290[1] - m_unk0x298[1];
} }
if (m_unk0x100 == 0) { if (m_unk0x100 == 0) {
m_unk0x114 = m_unk0x110->GetWorldBoundingSphere(); m_unk0x114 = m_selectedPart->GetWorldBoundingSphere();
} }
} }
else { else {
if (m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { if (m_animPresenter->FUN_10079c30(m_selectedPart->GetName())) {
m_unk0x114 = m_unk0x258->FUN_10079e20(); m_unk0x114 = m_animPresenter->FUN_10079e20();
} }
} }
@ -870,53 +872,57 @@ undefined4 LegoCarBuild::FUN_100244e0(MxLong p_x, MxLong p_y)
m_GetBrick_Sound->Enable(FALSE); m_GetBrick_Sound->Enable(FALSE);
m_GetBrick_Sound->Enable(TRUE); m_GetBrick_Sound->Enable(TRUE);
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
return 1; return 1;
} }
// FUNCTION: LEGO1 0x100246e0 // FUNCTION: LEGO1 0x100246e0
// FUNCTION: BETA10 0x1006d25a
undefined4 LegoCarBuild::FUN_100246e0(MxLong p_x, MxLong p_y) undefined4 LegoCarBuild::FUN_100246e0(MxLong p_x, MxLong p_y)
{ {
undefined4 result = 0;
switch (m_unk0x100) { switch (m_unk0x100) {
case 3: case 3:
FUN_10022f30(); FUN_10022f30();
return 1; result = 1;
break;
case 4: case 4:
FUN_10022f00(); FUN_10022f00();
return 1; result = 1;
break;
case 6: case 6:
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_selectedPart->GetName()) &&
if (SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) { SpheresIntersect(m_unk0x114, m_selectedPart->GetWorldBoundingSphere())) {
FUN_10024f70(FALSE); FUN_10024f70(FALSE);
FUN_100250e0(FALSE); FUN_100250e0(FALSE);
m_unk0x100 = 0; m_unk0x100 = 0;
m_unk0x110 = NULL; m_selectedPart = NULL;
m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE);
m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_stopped);
}
else if (m_animPresenter->FUN_10079c30(m_selectedPart->GetName())) {
if (SpheresIntersect(m_unk0x114, m_selectedPart->GetWorldBoundingSphere())) {
m_PlaceBrick_Sound->Enable(FALSE); m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE); m_PlaceBrick_Sound->Enable(TRUE);
m_unk0x258->SetUnknown0xbc(1); AddSelectedPartToBuild();
return 1; }
else {
VTable0x6c();
m_unk0x100 = 5;
} }
} }
else {
if (m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) {
if (SpheresIntersect(m_unk0x114, m_unk0x110->GetWorldBoundingSphere())) {
m_PlaceBrick_Sound->Enable(FALSE);
m_PlaceBrick_Sound->Enable(TRUE);
FUN_100236d0();
return 1;
}
VTable0x6c(); VTable0x6c();
m_unk0x100 = 5; m_unk0x100 = 5;
return 1;
} }
VTable0x6c(); result = 1;
m_unk0x100 = 5; break;
return 1;
default:
return 0;
} }
return result;
} }
// FUNCTION: LEGO1 0x10024850 // FUNCTION: LEGO1 0x10024850
@ -959,7 +965,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
DeleteObjects(&m_atomId, 500, 510); DeleteObjects(&m_atomId, 500, 510);
} }
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_destLocation = LegoGameState::e_infomain; m_destLocation = LegoGameState::e_infomain;
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
result = 1; result = 1;
@ -973,12 +979,12 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
DeleteObjects(&m_atomId, 500, 510); DeleteObjects(&m_atomId, 500, 510);
} }
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
if (GameState()->GetCurrentAct() == LegoGameState::e_act2) { if (GameState()->GetCurrentAct() == LegoGameState::e_act2) {
FUN_100243a0(); FUN_100243a0();
} }
else if (m_unk0x258->AllPartsPlaced() || m_buildState->m_unk0x4d) { else if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) {
m_buildState->m_unk0x4d = TRUE; m_buildState->m_unk0x4d = TRUE;
InvokeAction(Extra::e_start, m_atomId, m_carId, NULL); InvokeAction(Extra::e_start, m_atomId, m_carId, NULL);
@ -1015,7 +1021,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
(m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) { (m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) {
m_unk0x258->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); m_animPresenter->SetPartObjectIdByName(m_selectedPart->GetName(), param->m_clickedObjectId);
m_Decal_Sound->Enable(FALSE); m_Decal_Sound->Enable(FALSE);
m_Decal_Sound->Enable(TRUE); m_Decal_Sound->Enable(TRUE);
} }
@ -1048,16 +1054,16 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
if (param->m_unk0x28) { if (param->m_unk0x28) {
switch (param->m_clickedObjectId) { switch (param->m_clickedObjectId) {
case CopterScript::c_Info_Ctl: case CopterScript::c_Info_Ctl:
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
m_destLocation = LegoGameState::e_infomain; m_destLocation = LegoGameState::e_infomain;
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
result = 1; result = 1;
break; break;
case CopterScript::c_Exit_Ctl: case CopterScript::c_Exit_Ctl:
if (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting) { if (m_buildState->m_animationState != LegoVehicleBuildState::e_exiting) {
m_unk0x258->SetUnknown0xbc(0); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_selected);
if (m_unk0x258->AllPartsPlaced() || m_buildState->m_unk0x4d) { if (m_animPresenter->AllPartsPlaced() || m_buildState->m_unk0x4d) {
m_buildState->m_unk0x4d = TRUE; m_buildState->m_unk0x4d = TRUE;
// GameState()->GetCurrentAct() returns an MxS16 in BETA10 // GameState()->GetCurrentAct() returns an MxS16 in BETA10
@ -1119,7 +1125,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
(m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl5 && m_Decals_Ctl5->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) || (m_Decals_Ctl6 && m_Decals_Ctl6->GetAction()->GetObjectId() == param->m_clickedObjectId) ||
(m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) { (m_Decals_Ctl7 && m_Decals_Ctl7->GetAction()->GetObjectId() == param->m_clickedObjectId)) {
m_unk0x258->SetPartObjectIdByName(m_unk0x110->GetName(), param->m_clickedObjectId); m_animPresenter->SetPartObjectIdByName(m_selectedPart->GetName(), param->m_clickedObjectId);
m_Decal_Sound->Enable(FALSE); m_Decal_Sound->Enable(FALSE);
m_Decal_Sound->Enable(TRUE); m_Decal_Sound->Enable(TRUE);
} }
@ -1141,7 +1147,7 @@ undefined4 LegoCarBuild::FUN_10024890(MxParam* p_param)
// FUNCTION: LEGO1 0x10024c20 // FUNCTION: LEGO1 0x10024c20
// FUNCTION: BETA10 0x1006db21 // FUNCTION: BETA10 0x1006db21
undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param) undefined4 LegoCarBuild::FUN_10024c20(MxNotificationParam* p_param)
{ {
LegoEntity* entity; LegoEntity* entity;
assert(m_buildState); assert(m_buildState);
@ -1196,7 +1202,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
assert(destWorld); assert(destWorld);
m_buildState->m_animationState = LegoVehicleBuildState::e_exiting; m_buildState->m_animationState = LegoVehicleBuildState::e_exiting;
if (!m_unk0x258->AllPartsPlaced()) { if (!m_animPresenter->AllPartsPlaced()) {
FUN_100243a0(); FUN_100243a0();
} }
else { else {
@ -1227,7 +1233,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
m_unk0x338 = SoundManager()->FUN_100aebd0(*g_jukeboxScript, jukeboxScript); m_unk0x338 = SoundManager()->FUN_100aebd0(*g_jukeboxScript, jukeboxScript);
if (m_unk0x338) { if (m_unk0x338) {
BackgroundAudioManager()->FUN_1007f610(m_unk0x338, 5, MxPresenter::e_repeating); BackgroundAudioManager()->SetPendingPresenter(m_unk0x338, 5, MxPresenter::e_repeating);
FUN_10024ef0(); FUN_10024ef0();
} }
else { else {
@ -1243,7 +1249,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
// FUNCTION: LEGO1 0x10024ef0 // FUNCTION: LEGO1 0x10024ef0
void LegoCarBuild::FUN_10024ef0() void LegoCarBuild::FUN_10024ef0()
{ {
FUN_1003eda0(); ResetViewVelocity();
m_buildState->m_animationState = LegoVehicleBuildState::e_cutscene; m_buildState->m_animationState = LegoVehicleBuildState::e_cutscene;
FUN_10025720(FUN_10025d70()); FUN_10025720(FUN_10025d70());
m_buildState->m_unk0x4c += 1; m_buildState->m_unk0x4c += 1;
@ -1255,22 +1261,22 @@ void LegoCarBuild::FUN_10024ef0()
void LegoCarBuild::FUN_10024f30() void LegoCarBuild::FUN_10024f30()
{ {
FUN_10022f30(); FUN_10022f30();
m_unk0x258->SetUnknown0xbc(2); m_animPresenter->SetShelfState(LegoCarBuildAnimPresenter::e_moving);
} }
// FUNCTION: LEGO1 0x10024f50 // FUNCTION: LEGO1 0x10024f50
// FUNCTION: BETA10 0x1006dfce // FUNCTION: BETA10 0x1006dfce
void LegoCarBuild::FUN_10024f50() void LegoCarBuild::FUN_10024f50()
{ {
m_unk0x2d4 = FALSE; m_selectedPartIsPlaced = FALSE;
m_unk0x258->RotateAroundYAxis(g_rotationAngleStepYAxis); m_animPresenter->RotateAroundYAxis(g_rotationAngleStepYAxis);
} }
// FUNCTION: LEGO1 0x10024f70 // FUNCTION: LEGO1 0x10024f70
// FUNCTION: BETA10 0x1006e002 // FUNCTION: BETA10 0x1006e002
void LegoCarBuild::FUN_10024f70(MxBool p_enabled) void LegoCarBuild::FUN_10024f70(MxBool p_enabled)
{ {
if (m_unk0x258->StringEndsOnY(m_unk0x110->GetName())) { if (m_animPresenter->StringEndsOnY(m_selectedPart->GetName())) {
SetPresentersEnabled(p_enabled); SetPresentersEnabled(p_enabled);
} }
} }
@ -1305,31 +1311,31 @@ void LegoCarBuild::TogglePresentersEnabled()
// FUNCTION: BETA10 0x1006e124 // FUNCTION: BETA10 0x1006e124
void LegoCarBuild::FUN_100250e0(MxBool p_enabled) void LegoCarBuild::FUN_100250e0(MxBool p_enabled)
{ {
if (m_unk0x258->StringDoesNotEndOnZero(m_unk0x110->GetName()) && m_Decals_Ctl) { if (m_animPresenter->StringDoesNotEndOnZero(m_selectedPart->GetName()) && m_Decals_Ctl) {
if (strnicmp(m_unk0x110->GetName(), "JSFRNT", strlen("JSFRNT")) == 0) { if (strnicmp(m_selectedPart->GetName(), "JSFRNT", strlen("JSFRNT")) == 0) {
m_Decal_Bitmap->Enable(p_enabled); m_Decal_Bitmap->Enable(p_enabled);
m_Decals_Ctl->Enable(p_enabled); m_Decals_Ctl->Enable(p_enabled);
m_Decals_Ctl1->Enable(p_enabled); m_Decals_Ctl1->Enable(p_enabled);
m_Decals_Ctl2->Enable(p_enabled); m_Decals_Ctl2->Enable(p_enabled);
m_Decals_Ctl3->Enable(p_enabled); m_Decals_Ctl3->Enable(p_enabled);
} }
else if (strnicmp(m_unk0x110->GetName(), "JSWNSH", strlen("JSWNSH")) == 0) { else if (strnicmp(m_selectedPart->GetName(), "JSWNSH", strlen("JSWNSH")) == 0) {
m_Decal_Bitmap->Enable(p_enabled); m_Decal_Bitmap->Enable(p_enabled);
m_Decals_Ctl4->Enable(p_enabled); m_Decals_Ctl4->Enable(p_enabled);
m_Decals_Ctl5->Enable(p_enabled); m_Decals_Ctl5->Enable(p_enabled);
m_Decals_Ctl6->Enable(p_enabled); m_Decals_Ctl6->Enable(p_enabled);
m_Decals_Ctl7->Enable(p_enabled); m_Decals_Ctl7->Enable(p_enabled);
} }
else if (strnicmp(m_unk0x110->GetName(), "RCBACK", strlen("RCBACK")) == 0) { else if (strnicmp(m_selectedPart->GetName(), "RCBACK", strlen("RCBACK")) == 0) {
m_Decals_Ctl1->Enable(p_enabled); m_Decals_Ctl1->Enable(p_enabled);
} }
else if (strnicmp(m_unk0x110->GetName(), "RCTAIL", strlen("RCTAIL")) == 0) { else if (strnicmp(m_selectedPart->GetName(), "RCTAIL", strlen("RCTAIL")) == 0) {
m_Decals_Ctl2->Enable(p_enabled); m_Decals_Ctl2->Enable(p_enabled);
} }
else if (m_Decals_Ctl1 && strnicmp(m_unk0x110->GetName(), "chljety", strlen("chljety")) == 0) { else if (m_Decals_Ctl1 && strnicmp(m_selectedPart->GetName(), "chljety", strlen("chljety")) == 0) {
m_Decals_Ctl1->Enable(p_enabled); m_Decals_Ctl1->Enable(p_enabled);
} }
else if (m_Decals_Ctl2 && strnicmp(m_unk0x110->GetName(), "chrjety", strlen("chrjety")) == 0) { else if (m_Decals_Ctl2 && strnicmp(m_selectedPart->GetName(), "chrjety", strlen("chrjety")) == 0) {
m_Decals_Ctl2->Enable(p_enabled); m_Decals_Ctl2->Enable(p_enabled);
} }
else if (m_Decals_Ctl) { else if (m_Decals_Ctl) {
@ -1345,7 +1351,7 @@ void LegoCarBuild::FUN_10025350(MxS32 p_objectId)
const LegoChar* color; const LegoChar* color;
LegoChar buffer[256]; LegoChar buffer[256];
if (!m_unk0x110) { if (!m_selectedPart) {
return; return;
} }
@ -1373,8 +1379,8 @@ void LegoCarBuild::FUN_10025350(MxS32 p_objectId)
m_Paint_Sound->Enable(FALSE); m_Paint_Sound->Enable(FALSE);
m_Paint_Sound->Enable(TRUE); m_Paint_Sound->Enable(TRUE);
m_unk0x110->FUN_100a93b0(color); m_selectedPart->FUN_100a93b0(color);
sprintf(buffer, "c_%s", m_unk0x110->GetName()); sprintf(buffer, "c_%s", m_selectedPart->GetName());
VariableTable()->SetVariable(buffer, color); VariableTable()->SetVariable(buffer, color);
} }
@ -1382,11 +1388,11 @@ void LegoCarBuild::FUN_10025350(MxS32 p_objectId)
// FUNCTION: BETA10 0x1006e599 // FUNCTION: BETA10 0x1006e599
void LegoCarBuild::FUN_10025450() void LegoCarBuild::FUN_10025450()
{ {
m_unk0x12c = m_unk0x110->GetLocal2World(); m_unk0x12c = m_selectedPart->GetLocal2World();
m_unk0x1c0 = m_unk0x12c; m_unk0x1c0 = m_unk0x12c;
Vector3 lastColumnOfUnk0x1c0(m_unk0x1c0[3]); Vector3 lastColumnOfUnk0x1c0(m_unk0x1c0[3]);
lastColumnOfUnk0x1c0 = Vector3(m_unk0x258->GetUnknown0xe0()[3]); lastColumnOfUnk0x1c0 = Vector3(m_animPresenter->GetBuildViewMatrix()[3]);
// This looks odd, but it improves the LEGO1 match while breaking the BETA10 match. // This looks odd, but it improves the LEGO1 match while breaking the BETA10 match.
// I don't know whether this is due to compiler entropy. // I don't know whether this is due to compiler entropy.
@ -1395,10 +1401,10 @@ void LegoCarBuild::FUN_10025450()
MxMatrix* unk0x178 = &m_unk0x178; MxMatrix* unk0x178 = &m_unk0x178;
*unk0x178 = m_unk0x12c; *unk0x178 = m_unk0x12c;
if (m_unk0x258->PartIsPlaced(m_unk0x110->GetName())) { if (m_animPresenter->PartIsPlaced(m_selectedPart->GetName())) {
m_unk0x2a4 = Vector4(m_unk0x110->GetWorldPosition()); m_unk0x2a4 = Vector4(m_selectedPart->GetWorldPosition());
if (!m_unk0x2d4) { if (!m_selectedPartIsPlaced) {
m_unk0x2bc = m_unk0x2a4; m_unk0x2bc = m_unk0x2a4;
m_unk0x208 = m_unk0x12c; m_unk0x208 = m_unk0x12c;
@ -1412,17 +1418,17 @@ void LegoCarBuild::FUN_10025450()
else { else {
const LegoChar* wiredName; const LegoChar* wiredName;
if (!m_unk0x258->FUN_10079c30(m_unk0x110->GetName())) { if (!m_animPresenter->FUN_10079c30(m_selectedPart->GetName())) {
wiredName = m_unk0x258->GetWiredNameByPartName(m_unk0x110->GetName()); wiredName = m_animPresenter->GetWiredNameByPartName(m_selectedPart->GetName());
} }
else { else {
wiredName = m_unk0x258->GetWiredNameOfLastPlacedPart(); wiredName = m_animPresenter->GetWiredNameOfLastPlacedPart();
} }
LegoROI* parentROI = (LegoROI*) m_unk0x110->GetParentROI(); LegoROI* parentROI = (LegoROI*) m_selectedPart->GetParentROI();
m_unk0x208 = parentROI->FindChildROI(wiredName, parentROI)->GetLocal2World(); m_unk0x208 = parentROI->FindChildROI(wiredName, parentROI)->GetLocal2World();
m_unk0x2bc = Vector4(parentROI->FindChildROI(wiredName, parentROI)->GetWorldPosition()); m_unk0x2bc = Vector4(parentROI->FindChildROI(wiredName, parentROI)->GetWorldPosition());
m_unk0x2a4 = Vector4(m_unk0x110->GetWorldPosition()); m_unk0x2a4 = Vector4(m_selectedPart->GetWorldPosition());
m_unk0x2a4[2] += (m_unk0x1c0[3][2] - m_unk0x12c[3][2]); m_unk0x2a4[2] += (m_unk0x1c0[3][2] - m_unk0x12c[3][2]);
m_unk0x178[3][2] = m_unk0x1c0[3][2]; m_unk0x178[3][2] = m_unk0x1c0[3][2];
@ -1644,8 +1650,8 @@ void LegoCarBuild::FUN_10025db0(const char* p_param1, undefined4 p_param2)
} }
} }
else { else {
if (m_unk0x33c->GetUnknown0x4e() != sVar3) { if (m_unk0x33c->GetEnabledChild() != sVar3) {
m_unk0x33c->VTable0x6c(sVar3); m_unk0x33c->UpdateEnabledChild(sVar3);
} }
g_unk0x100f11cc = -1; g_unk0x100f11cc = -1;
@ -1658,7 +1664,7 @@ void LegoCarBuild::FUN_10025e40()
{ {
SetPresentersEnabled(m_presentersEnabled); SetPresentersEnabled(m_presentersEnabled);
if (m_unk0x33c && m_Yellow_Ctl != m_unk0x33c) { if (m_unk0x33c && m_Yellow_Ctl != m_unk0x33c) {
m_unk0x33c->VTable0x6c(0); m_unk0x33c->UpdateEnabledChild(0);
} }
} }

View File

@ -23,17 +23,17 @@ DECOMP_SIZE_ASSERT(LegoCarBuildAnimPresenter, 0x150)
// FUNCTION: BETA10 0x100707c0 // FUNCTION: BETA10 0x100707c0
LegoCarBuildAnimPresenter::LegoCarBuildAnimPresenter() LegoCarBuildAnimPresenter::LegoCarBuildAnimPresenter()
{ {
m_unk0xbc = 0; m_shelfState = e_selected;
m_numberOfParts = 0; m_numberOfParts = 0;
m_placedPartCount = 0; m_placedPartCount = 0;
m_parts = NULL; m_parts = NULL;
m_unk0xc4 = NULL; m_platformAnimNodeData = NULL;
m_unk0x130 = 0; m_shelfFrame = 0;
m_unk0x12c = 0; m_shelfFrameBuffer = 0;
m_unk0x134 = 0; m_shelfFrameMax = 0;
m_unk0x138 = 0; m_shelfFrameInterval = 0;
m_unk0x13c = 0; m_unk0x13c = 0;
m_unk0x140 = NULL; m_carBuildEntity = NULL;
m_unk0x144 = -1; m_unk0x144 = -1;
m_unk0x148 = -1; m_unk0x148 = -1;
m_mainSourceId = NULL; m_mainSourceId = NULL;
@ -45,14 +45,14 @@ LegoCarBuildAnimPresenter::~LegoCarBuildAnimPresenter()
{ {
if (m_parts) { if (m_parts) {
for (MxS16 i = 0; i < m_numberOfParts; i++) { for (MxS16 i = 0; i < m_numberOfParts; i++) {
delete m_parts[i].m_name; delete[] m_parts[i].m_name;
delete m_parts[i].m_wiredName; delete[] m_parts[i].m_wiredName;
} }
delete[] m_parts; delete[] m_parts;
} }
m_unk0xc8.GetRoot()->SetNumChildren(0); m_platformAnim.GetRoot()->SetNumChildren(0);
*m_unk0xc8.GetRoot()->GetChildren() = NULL; *m_platformAnim.GetRoot()->GetChildren() = NULL;
if (m_mainSourceId) { if (m_mainSourceId) {
delete[] m_mainSourceId; delete[] m_mainSourceId;
@ -114,14 +114,14 @@ inline void LegoCarBuildAnimPresenter::Beta10Inline0x100733d0()
// FUNCTION: BETA10 0x10070ab1 // FUNCTION: BETA10 0x10070ab1
void LegoCarBuildAnimPresenter::PutFrame() void LegoCarBuildAnimPresenter::PutFrame()
{ {
switch (m_unk0xbc) { switch (m_shelfState) {
case 0: case e_selected:
break; break;
case 2: case e_moving:
FUN_10079a90(); MoveShelfForward();
case 1: case e_stopped:
if (m_unk0x140->GetROI()) { if (m_carBuildEntity->GetROI()) {
FUN_1006b9a0(m_anim, m_unk0x12c, NULL); FUN_1006b9a0(m_anim, m_shelfFrameBuffer, NULL);
} }
default: default:
break; break;
@ -150,24 +150,24 @@ void LegoCarBuildAnimPresenter::ReadyTickle()
#endif #endif
} }
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Dunebld"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Dunebld");
if (!m_unk0x140) { if (!m_carBuildEntity) {
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Chptrbld"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Chptrbld");
} }
if (!m_unk0x140) { if (!m_carBuildEntity) {
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "Jetbld"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "Jetbld");
} }
if (!m_unk0x140) { if (!m_carBuildEntity) {
m_unk0x140 = (LegoEntity*) m_currentWorld->Find("MxEntity", "bldrace"); m_carBuildEntity = (LegoEntity*) m_currentWorld->Find("MxEntity", "bldrace");
} }
if (m_unk0x140) { if (m_carBuildEntity) {
((LegoCarBuild*) m_currentWorld)->SetUnknown0x258(this); ((LegoCarBuild*) m_currentWorld)->SetCarBuildAnimPresenter(this);
m_placedPartCount = ((LegoCarBuild*) m_currentWorld)->GetPlacedPartCount(); m_placedPartCount = ((LegoCarBuild*) m_currentWorld)->GetPlacedPartCount();
SetUnknown0xbc(1); SetShelfState(e_stopped);
m_previousTickleStates |= 1 << m_currentTickleState; m_previousTickleStates |= 1 << m_currentTickleState;
m_currentTickleState = e_starting; m_currentTickleState = e_starting;
m_compositePresenter->SendToCompositePresenter(Lego()); m_compositePresenter->SendToCompositePresenter(Lego());
@ -182,7 +182,7 @@ void LegoCarBuildAnimPresenter::ReadyTickle()
// FUNCTION: BETA10 0x10070cdd // FUNCTION: BETA10 0x10070cdd
void LegoCarBuildAnimPresenter::StreamingTickle() void LegoCarBuildAnimPresenter::StreamingTickle()
{ {
if (!m_unk0x140->GetROI()) { if (!m_carBuildEntity->GetROI()) {
return; return;
} }
@ -192,7 +192,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
strcpy(m_mainSourceId, m_action->GetAtomId().GetInternal()); strcpy(m_mainSourceId, m_action->GetAtomId().GetInternal());
m_mainSourceId[strlen(m_mainSourceId) - 1] = 'M'; m_mainSourceId[strlen(m_mainSourceId) - 1] = 'M';
FUN_10079160(); InitBuildPlatform();
if (GameState()->GetCurrentAct() == LegoGameState::e_act2) { if (GameState()->GetCurrentAct() == LegoGameState::e_act2) {
m_placedPartCount = 10; m_placedPartCount = 10;
@ -202,15 +202,15 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
for (i = 0; i < m_numberOfParts; i++) { for (i = 0; i < m_numberOfParts; i++) {
if (m_placedPartCount == i) { if (m_placedPartCount == i) {
FUN_10079680(m_parts[i].m_wiredName); ShowBuildPartByName(m_parts[i].m_wiredName);
} }
else { else {
FUN_100795d0(m_parts[i].m_wiredName); HideBuildPartByName(m_parts[i].m_wiredName);
} }
if (i < m_placedPartCount) { if (i < m_placedPartCount) {
FUN_10079050(i); FUN_10079050(i);
FUN_10079680(m_parts[i].m_name); ShowBuildPartByName(m_parts[i].m_name);
} }
LegoChar* name = m_parts[i].m_wiredName; LegoChar* name = m_parts[i].m_wiredName;
@ -220,8 +220,8 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
LegoROI* roi = m_roiMap[j]; LegoROI* roi = m_roiMap[j];
if (roi && roi->GetName() && (strcmpi(name, roi->GetName()) == 0)) { if (roi && roi->GetName() && (strcmpi(name, roi->GetName()) == 0)) {
roi->FUN_100a9dd0(); roi->ClearMeshOffset();
roi->FUN_100a9350("lego red"); roi->SetLodColor("lego red");
} }
} }
} }
@ -232,7 +232,7 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
Lego3DView* lego3dview = videoManager->Get3DManager()->GetLego3DView(); Lego3DView* lego3dview = videoManager->Get3DManager()->GetLego3DView();
LegoROI* videoManagerROI = videoManager->GetViewROI(); LegoROI* videoManagerROI = videoManager->GetViewROI();
LegoROI* local60 = m_unk0x140->GetROI(); LegoROI* local60 = m_carBuildEntity->GetROI();
LegoROI* camera = NULL; LegoROI* camera = NULL;
MxFloat fov; MxFloat fov;
@ -267,11 +267,11 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
CalcLocalTransform(cameraPosition, dirVec, upVec, localTransform); CalcLocalTransform(cameraPosition, dirVec, upVec, localTransform);
videoManagerROI->WrappedSetLocalTransform(localTransform); videoManagerROI->WrappedSetLocal2WorldWithWorldDataUpdate(localTransform);
lego3dview->Moved(*videoManagerROI); lego3dview->Moved(*videoManagerROI);
videoManager->Get3DManager()->SetFrustrum(fov, 0.1, 250.0); videoManager->Get3DManager()->SetFrustrum(fov, 0.1, 250.0);
m_unk0xe0 = local60->FindChildROI("VIEW", local60)->GetLocal2World(); m_buildViewMatrix = local60->FindChildROI("VIEW", local60)->GetLocal2World();
m_previousTickleStates |= 1 << m_currentTickleState; m_previousTickleStates |= 1 << m_currentTickleState;
m_currentTickleState = e_repeating; m_currentTickleState = e_repeating;
@ -284,7 +284,7 @@ void LegoCarBuildAnimPresenter::EndAction()
if (m_action) { if (m_action) {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
MxVideoPresenter::EndAction(); MxVideoPresenter::EndAction();
m_unk0xbc = 0; m_shelfState = e_selected;
} }
} }
@ -294,7 +294,7 @@ MxResult LegoCarBuildAnimPresenter::Serialize(LegoStorage* p_storage)
{ {
if (p_storage->IsReadMode()) { if (p_storage->IsReadMode()) {
p_storage->ReadS16(m_placedPartCount); p_storage->ReadS16(m_placedPartCount);
p_storage->ReadFloat(m_unk0x130); p_storage->ReadFloat(m_shelfFrame);
for (MxS16 i = 0; i < m_numberOfParts; i++) { for (MxS16 i = 0; i < m_numberOfParts; i++) {
p_storage->ReadString(m_parts[i].m_name); p_storage->ReadString(m_parts[i].m_name);
p_storage->ReadString(m_parts[i].m_wiredName); p_storage->ReadString(m_parts[i].m_wiredName);
@ -303,7 +303,7 @@ MxResult LegoCarBuildAnimPresenter::Serialize(LegoStorage* p_storage)
} }
else if (p_storage->IsWriteMode()) { else if (p_storage->IsWriteMode()) {
p_storage->WriteS16(m_placedPartCount); p_storage->WriteS16(m_placedPartCount);
p_storage->WriteFloat(m_unk0x130); p_storage->WriteFloat(m_shelfFrame);
for (MxS16 i = 0; i < m_numberOfParts; i++) { for (MxS16 i = 0; i < m_numberOfParts; i++) {
p_storage->WriteString(m_parts[i].m_name); p_storage->WriteString(m_parts[i].m_name);
p_storage->WriteString(m_parts[i].m_wiredName); p_storage->WriteString(m_parts[i].m_wiredName);
@ -319,7 +319,7 @@ MxResult LegoCarBuildAnimPresenter::Serialize(LegoStorage* p_storage)
void LegoCarBuildAnimPresenter::FUN_10079050(MxS16 p_index) void LegoCarBuildAnimPresenter::FUN_10079050(MxS16 p_index)
{ {
SwapNodesByName(m_parts[p_index].m_wiredName, m_parts[p_index].m_name); SwapNodesByName(m_parts[p_index].m_wiredName, m_parts[p_index].m_name);
FUN_100795d0(m_parts[p_index].m_wiredName); HideBuildPartByName(m_parts[p_index].m_wiredName);
} }
// FUNCTION: LEGO1 0x10079090 // FUNCTION: LEGO1 0x10079090
@ -336,15 +336,15 @@ void LegoCarBuildAnimPresenter::SwapNodesByName(LegoChar* p_name1, LegoChar* p_n
strcpy(node1->GetName(), node2->GetName()); strcpy(node1->GetName(), node2->GetName());
strcpy(node2->GetName(), buffer); strcpy(node2->GetName(), buffer);
LegoU16 val1 = node1->GetUnknown0x20(); LegoU16 val1 = node1->GetROIIndex();
node1->SetUnknown0x20(node2->GetUnknown0x20()); node1->SetROIIndex(node2->GetROIIndex());
node2->SetUnknown0x20(val1); node2->SetROIIndex(val1);
} }
} }
// FUNCTION: LEGO1 0x10079160 // FUNCTION: LEGO1 0x10079160
// FUNCTION: BETA10 0x1007165d // FUNCTION: BETA10 0x1007165d
void LegoCarBuildAnimPresenter::FUN_10079160() void LegoCarBuildAnimPresenter::InitBuildPlatform()
{ {
LegoTreeNode* root; LegoTreeNode* root;
LegoAnimNodeData* data2; LegoAnimNodeData* data2;
@ -355,16 +355,17 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
LegoAnimNodeData* destData; LegoAnimNodeData* destData;
LegoTreeNode** children; LegoTreeNode** children;
// Get Platform data, Shelf Frame data, and number of build parts
for (i = 0; i < totalNodes; i++) { for (i = 0; i < totalNodes; i++) {
LegoAnimNodeData* data = (LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData(); LegoAnimNodeData* data = (LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData();
name = data->GetName(); name = data->GetName();
if (StringEqualsPlatform(name)) { if (StringEqualsPlatform(name)) {
m_unk0xc4 = data; m_platformAnimNodeData = data;
if (m_unk0xc4->GetNumRotationKeys() == 0) { if (m_platformAnimNodeData->GetNumRotationKeys() == 0) {
LegoRotationKey* key = new LegoRotationKey(); LegoRotationKey* key = new LegoRotationKey();
m_unk0xc4->SetNumRotationKeys(1); m_platformAnimNodeData->SetNumRotationKeys(1);
m_unk0xc4->SetRotationKeys(key); m_platformAnimNodeData->SetRotationKeys(key);
} }
} }
else { else {
@ -372,9 +373,9 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
m_numberOfParts++; m_numberOfParts++;
} }
else { else {
if (m_unk0x134 == 0.0f && StringEqualsShelf(name)) { if (m_shelfFrameMax == 0.0f && StringEqualsShelf(name)) {
m_unk0x134 = m_anim->GetDuration(); m_shelfFrameMax = m_anim->GetDuration();
m_unk0x138 = m_unk0x134 / (data->GetNumTranslationKeys() - 1); m_shelfFrameInterval = m_shelfFrameMax / (data->GetNumTranslationKeys() - 1);
} }
} }
} }
@ -384,6 +385,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
m_parts = new UnknownListEntry[m_numberOfParts]; m_parts = new UnknownListEntry[m_numberOfParts];
assert(m_parts); assert(m_parts);
// Go through and add the wired name of each part
for (i = 0; i < totalNodes; i++) { for (i = 0; i < totalNodes; i++) {
name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName(); name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName();
@ -402,6 +404,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
MxS16 counter = 0; MxS16 counter = 0;
// Go through and add the normal name of each part
for (i = 0; i < totalNodes; i++) { for (i = 0; i < totalNodes; i++) {
name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName(); name = ((LegoAnimNodeData*) GetTreeNode(m_anim->GetRoot(), i)->GetData())->GetName();
if (StringEndsOnYOrN(name)) { if (StringEndsOnYOrN(name)) {
@ -420,6 +423,7 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
} }
} }
// Set Platform root node
destNode = new LegoTreeNode(); destNode = new LegoTreeNode();
assert(destNode); assert(destNode);
destData = new LegoAnimNodeData(); destData = new LegoAnimNodeData();
@ -431,17 +435,17 @@ void LegoCarBuildAnimPresenter::FUN_10079160()
destData->SetName(data2->GetName()); destData->SetName(data2->GetName());
destNode->SetNumChildren(1); destNode->SetNumChildren(1);
children = new LegoTreeNode*; children = new LegoTreeNode*[1];
assert(children); assert(children);
*children = FindNodeByName(m_anim->GetRoot(), "PLATFORM"); *children = FindNodeByName(m_anim->GetRoot(), "PLATFORM");
destNode->SetChildren(children); destNode->SetChildren(children);
m_unk0xc8.SetRoot(destNode); m_platformAnim.SetRoot(destNode);
} }
// FUNCTION: LEGO1 0x100795d0 // FUNCTION: LEGO1 0x100795d0
// FUNCTION: BETA10 0x10071d96 // FUNCTION: BETA10 0x10071d96
void LegoCarBuildAnimPresenter::FUN_100795d0(LegoChar* p_param) void LegoCarBuildAnimPresenter::HideBuildPartByName(LegoChar* p_param)
{ {
LegoAnimNodeData* data = FindNodeDataByName(m_anim->GetRoot(), p_param); LegoAnimNodeData* data = FindNodeDataByName(m_anim->GetRoot(), p_param);
@ -452,18 +456,18 @@ void LegoCarBuildAnimPresenter::FUN_100795d0(LegoChar* p_param)
assert(newHideKey); assert(newHideKey);
newHideKey->SetTime(0); newHideKey->SetTime(0);
newHideKey->SetUnknown0x08(FALSE); newHideKey->SetVisible(FALSE);
data->SetNumMorphKeys(1); data->SetNumMorphKeys(1);
data->SetMorphKeys(newHideKey); data->SetMorphKeys(newHideKey);
delete oldMorphKeys; delete[] oldMorphKeys;
} }
} }
// FUNCTION: LEGO1 0x10079680 // FUNCTION: LEGO1 0x10079680
// FUNCTION: BETA10 0x10071ec5 // FUNCTION: BETA10 0x10071ec5
void LegoCarBuildAnimPresenter::FUN_10079680(LegoChar* p_param) void LegoCarBuildAnimPresenter::ShowBuildPartByName(LegoChar* p_param)
{ {
LegoAnimNodeData* data = FindNodeDataByName(m_anim->GetRoot(), p_param); LegoAnimNodeData* data = FindNodeDataByName(m_anim->GetRoot(), p_param);
@ -473,7 +477,7 @@ void LegoCarBuildAnimPresenter::FUN_10079680(LegoChar* p_param)
data->SetNumMorphKeys(0); data->SetNumMorphKeys(0);
data->SetMorphKeys(NULL); data->SetMorphKeys(NULL);
delete oldMorphKeys; delete[] oldMorphKeys;
} }
} }
@ -530,7 +534,7 @@ LegoTreeNode* LegoCarBuildAnimPresenter::FindNodeByName(LegoTreeNode* p_treeNode
// FUNCTION: LEGO1 0x10079790 // FUNCTION: LEGO1 0x10079790
// FUNCTION: BETA10 0x100720a3 // FUNCTION: BETA10 0x100720a3
void LegoCarBuildAnimPresenter::FUN_10079790(const LegoChar* p_name) void LegoCarBuildAnimPresenter::AddPartToBuildByName(const LegoChar* p_name)
{ {
MxS16 i; MxS16 i;
LegoChar buffer[40]; LegoChar buffer[40];
@ -553,7 +557,7 @@ void LegoCarBuildAnimPresenter::FUN_10079790(const LegoChar* p_name)
((LegoCarBuild*) m_currentWorld)->SetPlacedPartCount(m_placedPartCount); ((LegoCarBuild*) m_currentWorld)->SetPlacedPartCount(m_placedPartCount);
if (m_placedPartCount < m_numberOfParts) { if (m_placedPartCount < m_numberOfParts) {
FUN_10079680(m_parts[m_placedPartCount].m_wiredName); ShowBuildPartByName(m_parts[m_placedPartCount].m_wiredName);
} }
} }
@ -561,8 +565,8 @@ void LegoCarBuildAnimPresenter::FUN_10079790(const LegoChar* p_name)
// FUNCTION: BETA10 0x1007225d // FUNCTION: BETA10 0x1007225d
void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle) void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle)
{ {
if (m_unk0xc4) { if (m_platformAnimNodeData) {
LegoRotationKey* rotationKey = m_unk0xc4->GetRotationKey(0); LegoRotationKey* rotationKey = m_platformAnimNodeData->GetRotationKey(0);
Mx4DPointFloat Mx4DPointFloat
currentRotation(rotationKey->GetX(), rotationKey->GetY(), rotationKey->GetZ(), rotationKey->GetAngle()); currentRotation(rotationKey->GetX(), rotationKey->GetY(), rotationKey->GetZ(), rotationKey->GetAngle());
@ -573,39 +577,39 @@ void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle)
newRotation.EqualsHamiltonProduct(currentRotation, additionalRotation); newRotation.EqualsHamiltonProduct(currentRotation, additionalRotation);
if (newRotation[3] < 0.9999) { if (newRotation[3] < 0.9999) {
rotationKey->FUN_100739a0(TRUE); rotationKey->SetActive(TRUE);
} }
else { else {
rotationKey->FUN_100739a0(FALSE); rotationKey->SetActive(FALSE);
} }
m_unk0xc4->GetRotationKey(0)->SetX(newRotation[0]); m_platformAnimNodeData->GetRotationKey(0)->SetX(newRotation[0]);
m_unk0xc4->GetRotationKey(0)->SetY(newRotation[1]); m_platformAnimNodeData->GetRotationKey(0)->SetY(newRotation[1]);
m_unk0xc4->GetRotationKey(0)->SetZ(newRotation[2]); m_platformAnimNodeData->GetRotationKey(0)->SetZ(newRotation[2]);
m_unk0xc4->GetRotationKey(0)->SetAngle(newRotation[3]); m_platformAnimNodeData->GetRotationKey(0)->SetAngle(newRotation[3]);
if (m_unk0x140->GetROI()) { if (m_carBuildEntity->GetROI()) {
FUN_1006b9a0(&m_unk0xc8, m_unk0x12c, NULL); FUN_1006b9a0(&m_platformAnim, m_shelfFrameBuffer, NULL);
} }
} }
} }
// FUNCTION: LEGO1 0x10079a90 // FUNCTION: LEGO1 0x10079a90
// FUNCTION: BETA10 0x10072412 // FUNCTION: BETA10 0x10072412
void LegoCarBuildAnimPresenter::FUN_10079a90() void LegoCarBuildAnimPresenter::MoveShelfForward()
{ {
if (m_unk0x12c >= m_unk0x134) { if (m_shelfFrameBuffer >= m_shelfFrameMax) {
m_unk0x130 = 0.0; m_shelfFrame = 0.0;
m_unk0x12c = m_unk0x130; m_shelfFrameBuffer = m_shelfFrame;
m_unk0xbc = 1; m_shelfState = e_stopped;
} }
else if (m_unk0x12c >= m_unk0x138 + m_unk0x130) { else if (m_shelfFrameBuffer >= m_shelfFrameInterval + m_shelfFrame) {
m_unk0x130 = m_unk0x138 + m_unk0x130; m_shelfFrame = m_shelfFrameInterval + m_shelfFrame;
m_unk0x12c = m_unk0x130; m_shelfFrameBuffer = m_shelfFrame;
m_unk0xbc = 1; m_shelfState = e_stopped;
} }
else { else {
m_unk0x12c = m_unk0x138 / 10.0f + m_unk0x12c; m_shelfFrameBuffer = m_shelfFrameInterval / 10.0f + m_shelfFrameBuffer;
} }
} }
@ -706,6 +710,6 @@ void LegoCarBuildAnimPresenter::SetPartObjectIdByName(const LegoChar* p_name, Mx
// FUNCTION: BETA10 0x10072959 // FUNCTION: BETA10 0x10072959
const BoundingSphere& LegoCarBuildAnimPresenter::FUN_10079e20() const BoundingSphere& LegoCarBuildAnimPresenter::FUN_10079e20()
{ {
LegoROI* roi = m_unk0x140->GetROI(); LegoROI* roi = m_carBuildEntity->GetROI();
return roi->FindChildROI(m_parts[m_placedPartCount].m_wiredName, roi)->GetWorldBoundingSphere(); return roi->FindChildROI(m_parts[m_placedPartCount].m_wiredName, roi)->GetWorldBoundingSphere();
} }

File diff suppressed because it is too large Load Diff

View File

@ -502,7 +502,7 @@ void LegoAnimationManager::Init()
m_unk0x1a = FALSE; m_unk0x1a = FALSE;
m_tranInfoList = NULL; m_tranInfoList = NULL;
m_tranInfoList2 = NULL; m_tranInfoList2 = NULL;
m_unk0x41c = g_legoAnimationManagerConfig <= 1 ? 10 : 20; m_maxAllowedExtras = g_legoAnimationManagerConfig <= 1 ? 10 : 20;
MxS32 i; MxS32 i;
for (i = 0; i < (MxS32) sizeOfArray(m_unk0x28); i++) { for (i = 0; i < (MxS32) sizeOfArray(m_unk0x28); i++) {
@ -658,7 +658,7 @@ MxResult LegoAnimationManager::LoadWorldInfo(LegoOmni::World p_worldId)
} }
MxU32 version; MxU32 version;
if (storage.Read(&version, sizeof(version)) == FAILURE) { if (storage.Read(&version, sizeof(MxU32)) == FAILURE) {
goto done; goto done;
} }
@ -667,7 +667,7 @@ MxResult LegoAnimationManager::LoadWorldInfo(LegoOmni::World p_worldId)
goto done; goto done;
} }
if (storage.Read(&m_animCount, sizeof(m_animCount)) == FAILURE) { if (storage.Read(&m_animCount, sizeof(MxU16)) == FAILURE) {
goto done; goto done;
} }
@ -679,7 +679,7 @@ MxResult LegoAnimationManager::LoadWorldInfo(LegoOmni::World p_worldId)
goto done; goto done;
} }
m_anims[j].m_unk0x28 = GetCharacterIndex(m_anims[j].m_name + strlen(m_anims[j].m_name) - 2); m_anims[j].m_characterIndex = GetCharacterIndex(m_anims[j].m_name + strlen(m_anims[j].m_name) - 2);
m_anims[j].m_unk0x29 = FALSE; m_anims[j].m_unk0x29 = FALSE;
for (k = 0; k < 3; k++) { for (k = 0; k < 3; k++) {
@ -760,7 +760,7 @@ MxResult LegoAnimationManager::ReadAnimInfo(LegoStorage* p_storage, AnimInfo* p_
MxU8 length; MxU8 length;
MxS32 i, j; MxS32 i, j;
if (p_storage->Read(&length, sizeof(length)) == FAILURE) { if (p_storage->Read(&length, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
@ -770,33 +770,33 @@ MxResult LegoAnimationManager::ReadAnimInfo(LegoStorage* p_storage, AnimInfo* p_
} }
p_info->m_name[length] = 0; p_info->m_name[length] = 0;
if (p_storage->Read(&p_info->m_objectId, sizeof(p_info->m_objectId)) == FAILURE) { if (p_storage->Read(&p_info->m_objectId, sizeof(MxU32)) == FAILURE) {
goto done; goto done;
} }
if (p_storage->Read(&p_info->m_location, sizeof(p_info->m_location)) == FAILURE) { if (p_storage->Read(&p_info->m_location, sizeof(MxS16)) == FAILURE) {
goto done; goto done;
} }
if (p_storage->Read(&p_info->m_unk0x0a, sizeof(p_info->m_unk0x0a)) == FAILURE) { if (p_storage->Read(&p_info->m_unk0x0a, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
if (p_storage->Read(&p_info->m_unk0x0b, sizeof(p_info->m_unk0x0b)) == FAILURE) { if (p_storage->Read(&p_info->m_unk0x0b, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
if (p_storage->Read(&p_info->m_unk0x0c, sizeof(p_info->m_unk0x0c)) == FAILURE) { if (p_storage->Read(&p_info->m_unk0x0c, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
if (p_storage->Read(&p_info->m_unk0x0d, sizeof(p_info->m_unk0x0d)) == FAILURE) { if (p_storage->Read(&p_info->m_unk0x0d, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
for (i = 0; i < (MxS32) sizeOfArray(p_info->m_unk0x10); i++) { for (i = 0; i < (MxS32) sizeOfArray(p_info->m_unk0x10); i++) {
if (p_storage->Read(&p_info->m_unk0x10[i], sizeof(*p_info->m_unk0x10)) != SUCCESS) { if (p_storage->Read(&p_info->m_unk0x10[i], sizeof(float)) != SUCCESS) {
goto done; goto done;
} }
} }
if (p_storage->Read(&p_info->m_modelCount, sizeof(p_info->m_modelCount)) == FAILURE) { if (p_storage->Read(&p_info->m_modelCount, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
@ -821,7 +821,7 @@ MxResult LegoAnimationManager::ReadModelInfo(LegoStorage* p_storage, ModelInfo*
MxResult result = FAILURE; MxResult result = FAILURE;
MxU8 length; MxU8 length;
if (p_storage->Read(&length, 1) == FAILURE) { if (p_storage->Read(&length, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
@ -831,20 +831,20 @@ MxResult LegoAnimationManager::ReadModelInfo(LegoStorage* p_storage, ModelInfo*
} }
p_info->m_name[length] = 0; p_info->m_name[length] = 0;
if (p_storage->Read(&p_info->m_unk0x04, sizeof(p_info->m_unk0x04)) == FAILURE) { if (p_storage->Read(&p_info->m_unk0x04, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
if (p_storage->Read(p_info->m_location, sizeof(p_info->m_location)) != SUCCESS) { if (p_storage->Read(p_info->m_location, 3 * sizeof(float)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(p_info->m_direction, sizeof(p_info->m_direction)) != SUCCESS) { if (p_storage->Read(p_info->m_direction, 3 * sizeof(float)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(p_info->m_up, sizeof(p_info->m_up)) != SUCCESS) { if (p_storage->Read(p_info->m_up, 3 * sizeof(float)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&p_info->m_unk0x2c, sizeof(p_info->m_unk0x2c)) == FAILURE) { if (p_storage->Read(&p_info->m_unk0x2c, sizeof(MxU8)) == FAILURE) {
goto done; goto done;
} }
@ -861,18 +861,18 @@ void LegoAnimationManager::DeleteAnimations()
if (m_anims != NULL) { if (m_anims != NULL) {
for (MxS32 i = 0; i < m_animCount; i++) { for (MxS32 i = 0; i < m_animCount; i++) {
delete m_anims[i].m_name; delete[] m_anims[i].m_name;
if (m_anims[i].m_models != NULL) { if (m_anims[i].m_models != NULL) {
for (MxS32 j = 0; j < m_anims[i].m_modelCount; j++) { for (MxS32 j = 0; j < m_anims[i].m_modelCount; j++) {
delete m_anims[i].m_models[j].m_name; delete[] m_anims[i].m_models[j].m_name;
} }
delete m_anims[i].m_models; delete[] m_anims[i].m_models;
} }
} }
delete m_anims; delete[] m_anims;
} }
Init(); Init();
@ -1555,7 +1555,7 @@ MxResult LegoAnimationManager::Tickle()
return SUCCESS; return SUCCESS;
} }
m_unk0x410 = (rand() * 10000 / SHRT_MAX) + 5000; m_unk0x410 = (rand() * 10000 / RAND_MAX) + 5000;
m_unk0x408 = time; m_unk0x408 = time;
if (time - m_unk0x404 > 10000) { if (time - m_unk0x404 > 10000) {
@ -1570,7 +1570,7 @@ MxResult LegoAnimationManager::Tickle()
if (elapsedSeconds > 0.2 && m_numAllowedExtras > 2) { if (elapsedSeconds > 0.2 && m_numAllowedExtras > 2) {
m_numAllowedExtras--; m_numAllowedExtras--;
} }
else if (g_unk0x100f7500 < 0.16 && m_numAllowedExtras < m_unk0x41c) { else if (g_unk0x100f7500 < 0.16 && m_numAllowedExtras < m_maxAllowedExtras) {
m_numAllowedExtras++; m_numAllowedExtras++;
} }
} }
@ -1615,7 +1615,8 @@ MxU16 LegoAnimationManager::FUN_10062110(
MxS8 index = GetCharacterIndex(p_roi->GetName()); MxS8 index = GetCharacterIndex(p_roi->GetName());
for (MxU16 i = m_unk0x0e; i <= m_unk0x10; i++) { for (MxU16 i = m_unk0x0e; i <= m_unk0x10; i++) {
if (m_anims[i].m_unk0x28 == index && m_anims[i].m_unk0x0c & p_unk0x0c && m_anims[i].m_unk0x29) { if (m_anims[i].m_characterIndex == index && m_anims[i].m_unk0x0c & p_unk0x0c &&
m_anims[i].m_unk0x29) {
MxS32 vehicleId = g_characters[index].m_vehicleId; MxS32 vehicleId = g_characters[index].m_vehicleId;
if (vehicleId >= 0) { if (vehicleId >= 0) {
MxBool found = FALSE; MxBool found = FALSE;
@ -1636,7 +1637,7 @@ MxU16 LegoAnimationManager::FUN_10062110(
MxU16 unk0x22 = m_anims[i].m_unk0x22; MxU16 unk0x22 = m_anims[i].m_unk0x22;
for (i = i + 1; i <= m_unk0x10; i++) { for (i = i + 1; i <= m_unk0x10; i++) {
if (m_anims[i].m_unk0x28 == index && m_anims[i].m_unk0x0c & p_unk0x0c && if (m_anims[i].m_characterIndex == index && m_anims[i].m_unk0x0c & p_unk0x0c &&
m_anims[i].m_unk0x29 && m_anims[i].m_unk0x22 < unk0x22) { m_anims[i].m_unk0x29 && m_anims[i].m_unk0x22 < unk0x22) {
result = i; result = i;
unk0x22 = m_anims[i].m_unk0x22; unk0x22 = m_anims[i].m_unk0x22;
@ -2012,10 +2013,10 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und)
float speed; float speed;
if (m_extras[i].m_unk0x14) { if (m_extras[i].m_unk0x14) {
speed = ((float) (rand() * 1.5) / 32767.0f) + 0.9; speed = ((float) (rand() * 1.5) / RAND_MAX) + 0.9;
} }
else { else {
speed = ((float) (rand() * 1.4) / 32767.0f) + 0.6; speed = ((float) (rand() * 1.4) / RAND_MAX) + 0.6;
} }
actor->SetWorldSpeed(speed); actor->SetWorldSpeed(speed);
@ -2418,10 +2419,10 @@ void LegoAnimationManager::FUN_10063d10()
if (speed < 0.0f) { if (speed < 0.0f) {
if (m_extras[i].m_unk0x14) { if (m_extras[i].m_unk0x14) {
speed = ((float) (rand() * 1.5) / 32767.0f) + 0.9; speed = ((float) (rand() * 1.5) / RAND_MAX) + 0.9;
} }
else { else {
speed = ((float) (rand() * 1.4) / 32767.0f) + 0.6; speed = ((float) (rand() * 1.4) / RAND_MAX) + 0.6;
} }
} }
@ -2463,7 +2464,7 @@ MxBool LegoAnimationManager::FUN_10063fb0(LegoLocation::Boundary* p_boundary, Le
if (p_boundary->m_name != NULL) { if (p_boundary->m_name != NULL) {
Mx3DPointFloat vec; Mx3DPointFloat vec;
LegoPathBoundary* boundary = p_world->FindPathBoundary(p_boundary->m_name); LegoPathBoundary* boundary = p_world->FindPathBoundary(p_boundary->m_name);
LegoUnknown100db7f4* pSrcE = (LegoUnknown100db7f4*) boundary->GetEdges()[p_boundary->m_src]; LegoOrientedEdge* pSrcE = (LegoOrientedEdge*) boundary->GetEdges()[p_boundary->m_src];
return FUN_10064010(boundary, pSrcE, p_boundary->m_srcScale); return FUN_10064010(boundary, pSrcE, p_boundary->m_srcScale);
} }
@ -2472,7 +2473,7 @@ MxBool LegoAnimationManager::FUN_10063fb0(LegoLocation::Boundary* p_boundary, Le
// FUNCTION: LEGO1 0x10064010 // FUNCTION: LEGO1 0x10064010
// FUNCTION: BETA10 0x100453a5 // FUNCTION: BETA10 0x100453a5
MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoUnknown100db7f4* p_edge, float p_destScale) MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoOrientedEdge* p_edge, float p_destScale)
{ {
Mx3DPointFloat p1; Mx3DPointFloat p1;
Vector3* v1 = p_edge->CWVertex(*p_boundary); Vector3* v1 = p_edge->CWVertex(*p_boundary);
@ -2505,7 +2506,7 @@ MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoUnkn
MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2) MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2)
{ {
MxU32 local2c = 12; MxU32 local2c = 12;
float destScale = ((rand() * 0.5) / 32767.0) + 0.25; float destScale = ((rand() * 0.5) / RAND_MAX) + 0.25;
LegoPathActor* actor = UserActor(); LegoPathActor* actor = UserActor();
if (actor == NULL) { if (actor == NULL) {
@ -2520,15 +2521,15 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
Mx3DPointFloat direction = actor->GetWorldDirection(); Mx3DPointFloat direction = actor->GetWorldDirection();
float local4c = 0.0f; float local4c = 0.0f;
LegoUnknown100db7f4* local50 = NULL; LegoOrientedEdge* local50 = NULL;
LegoS32 numEdges = boundary->GetNumEdges(); LegoS32 numEdges = boundary->GetNumEdges();
Mx3DPointFloat vec; Mx3DPointFloat vec;
LegoUnknown100db7f4* e; LegoOrientedEdge* e;
MxS32 i; MxS32 i;
for (i = 0; i < numEdges; i++) { for (i = 0; i < numEdges; i++) {
e = (LegoUnknown100db7f4*) boundary->GetEdges()[i]; e = (LegoOrientedEdge*) boundary->GetEdges()[i];
e->FUN_1002ddc0(*boundary, vec); e->GetFaceNormal(*boundary, vec);
float dot = vec.Dot(direction, vec); float dot = vec.Dot(direction, vec);
if (dot > local4c) { if (dot > local4c) {
@ -2539,7 +2540,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
e = local50; e = local50;
do { do {
e = (LegoUnknown100db7f4*) e->GetCounterclockwiseEdge(*boundary); e = (LegoOrientedEdge*) e->GetCounterclockwiseEdge(*boundary);
if (e->GetMask0x03()) { if (e->GetMask0x03()) {
break; break;
} }
@ -2549,8 +2550,8 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
return FALSE; return FALSE;
} }
LegoUnknown100db7f4* local34 = e; LegoOrientedEdge* local34 = e;
LegoUnknown100db7f4* local8 = local50; LegoOrientedEdge* local8 = local50;
while (local2c--) { while (local2c--) {
if (local34 != NULL) { if (local34 != NULL) {
@ -2561,7 +2562,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
numEdges = boundary->GetNumEdges(); numEdges = boundary->GetNumEdges();
for (i = 0; i < numEdges; i++) { for (i = 0; i < numEdges; i++) {
LegoUnknown100db7f4* e = (LegoUnknown100db7f4*) boundary->GetEdges()[i]; LegoOrientedEdge* e = (LegoOrientedEdge*) boundary->GetEdges()[i];
if (local34 == e) { if (local34 == e) {
p_boundary->m_src = i; p_boundary->m_src = i;
@ -2580,10 +2581,10 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
do { do {
if (p_bool1) { if (p_bool1) {
local34 = (LegoUnknown100db7f4*) local34->GetCounterclockwiseEdge(*boundary); local34 = (LegoOrientedEdge*) local34->GetCounterclockwiseEdge(*boundary);
} }
else { else {
local34 = (LegoUnknown100db7f4*) local34->GetClockwiseEdge(*boundary); local34 = (LegoOrientedEdge*) local34->GetClockwiseEdge(*boundary);
} }
} while (!local34->GetMask0x03() && local34 != local50); } while (!local34->GetMask0x03() && local34 != local50);
@ -2807,7 +2808,7 @@ void LegoAnimationManager::FUN_100648f0(LegoTranInfo* p_tranInfo, MxLong p_unk0x
Mx3DPointFloat vec; Mx3DPointFloat vec;
vec.Clear(); vec.Clear();
viewROI->FUN_100a5a30(vec); viewROI->SetWorldVelocity(vec);
} }
} }
@ -2840,7 +2841,7 @@ void LegoAnimationManager::FUN_10064b50(MxLong p_time)
LegoROI* viewROI = VideoManager()->GetViewROI(); LegoROI* viewROI = VideoManager()->GetViewROI();
viewROI->WrappedSetLocalTransform(mat); viewROI->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
VideoManager()->Get3DManager()->Moved(*viewROI); VideoManager()->Get3DManager()->Moved(*viewROI);
SoundManager()->UpdateListener( SoundManager()->UpdateListener(
viewROI->GetWorldPosition(), viewROI->GetWorldPosition(),

View File

@ -30,7 +30,7 @@ LegoAnimMMPresenter::LegoAnimMMPresenter()
m_unk0x59 = 0; m_unk0x59 = 0;
m_tranInfo = NULL; m_tranInfo = NULL;
m_unk0x54 = 0; m_unk0x54 = 0;
m_unk0x64 = NULL; m_world = NULL;
m_unk0x68 = NULL; m_unk0x68 = NULL;
m_roiMap = NULL; m_roiMap = NULL;
m_roiMapSize = 0; m_roiMapSize = 0;
@ -44,7 +44,7 @@ LegoAnimMMPresenter::~LegoAnimMMPresenter()
VideoManager()->UnregisterPresenter(*this); VideoManager()->UnregisterPresenter(*this);
} }
delete m_unk0x68; delete[] m_unk0x68;
NotificationManager()->Unregister(this); NotificationManager()->Unregister(this);
} }
@ -101,9 +101,9 @@ MxResult LegoAnimMMPresenter::StartAction(MxStreamController* p_controller, MxDS
} }
} }
m_unk0x64 = CurrentWorld(); m_world = CurrentWorld();
if (m_unk0x64) { if (m_world) {
m_unk0x64->Add(this); m_world->Add(this);
} }
VideoManager()->RegisterPresenter(*this); VideoManager()->RegisterPresenter(*this);
@ -133,8 +133,8 @@ void LegoAnimMMPresenter::EndAction()
if (m_action != NULL) { if (m_action != NULL) {
MxCompositePresenter::EndAction(); MxCompositePresenter::EndAction();
if (m_unk0x64 != NULL) { if (m_world != NULL) {
m_unk0x64->Remove(this); m_world->Remove(this);
} }
} }
} }
@ -364,7 +364,7 @@ MxBool LegoAnimMMPresenter::FUN_1004b5b0(MxLong p_time)
LegoROI* roi = m_roiMap[i]; LegoROI* roi = m_roiMap[i];
if (roi != NULL) { if (roi != NULL) {
roi->WrappedSetLocalTransform(m_unk0x68[i]); roi->WrappedSetLocal2WorldWithWorldDataUpdate(m_unk0x68[i]);
} }
} }
} }
@ -400,7 +400,7 @@ MxBool LegoAnimMMPresenter::FUN_1004b610(MxLong p_time)
} }
} }
m_action->SetUnknown90(Timer()->GetTime()); m_action->SetTimeStarted(Timer()->GetTime());
if (m_compositePresenter != NULL) { if (m_compositePresenter != NULL) {
m_compositePresenter->VTable0x60(this); m_compositePresenter->VTable0x60(this);
@ -429,11 +429,11 @@ MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time)
LegoPathActor* actor = UserActor(); LegoPathActor* actor = UserActor();
if (m_tranInfo != NULL && m_tranInfo->m_unk0x14 && m_tranInfo->m_location != -1 && actor != NULL) { if (m_tranInfo != NULL && m_tranInfo->m_unk0x14 && m_tranInfo->m_location != -1 && actor != NULL) {
if (m_unk0x64 != NULL) { if (m_world != NULL) {
undefined4 und = 1; undefined4 und = 1;
if (m_presenter != NULL) { if (m_presenter != NULL) {
m_unk0x64->RemoveActor(actor); m_world->RemoveActor(actor);
if (m_tranInfo->m_unk0x29) { if (m_tranInfo->m_unk0x29) {
Mx3DPointFloat position, direction; Mx3DPointFloat position, direction;
@ -442,7 +442,7 @@ MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time)
direction = viewROI->GetWorldDirection(); direction = viewROI->GetWorldDirection();
position[1] -= 1.25; position[1] -= 1.25;
und = m_unk0x64->PlaceActor(actor, m_presenter, position, direction); und = m_world->PlaceActor(actor, m_presenter, position, direction);
} }
else { else {
und = 0; und = 0;
@ -450,9 +450,9 @@ MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time)
} }
if (und != 0) { if (und != 0) {
viewROI->WrappedSetLocalTransform(m_tranInfo->m_unk0x2c); viewROI->WrappedSetLocal2WorldWithWorldDataUpdate(m_tranInfo->m_unk0x2c);
VideoManager()->Get3DManager()->Moved(*viewROI); VideoManager()->Get3DManager()->Moved(*viewROI);
m_unk0x64->PlaceActor(actor); m_world->PlaceActor(actor);
} }
if (m_tranInfo->m_unk0x29) { if (m_tranInfo->m_unk0x29) {

View File

@ -199,10 +199,10 @@ LegoBuildingInfo g_buildingInfoInit[16] = {
MxU32 LegoBuildingManager::g_maxSound = 6; MxU32 LegoBuildingManager::g_maxSound = 6;
// GLOBAL: LEGO1 0x100f373c // GLOBAL: LEGO1 0x100f373c
MxU32 g_unk0x100f373c = 0x3c; MxU32 g_buildingSoundIdOffset = 0x3c;
// GLOBAL: LEGO1 0x100f3740 // GLOBAL: LEGO1 0x100f3740
MxU32 g_unk0x100f3740 = 0x42; MxU32 g_buildingSoundIdMoodOffset = 0x42;
// clang-format off // clang-format off
// GLOBAL: LEGO1 0x100f3788 // GLOBAL: LEGO1 0x100f3788
@ -227,6 +227,8 @@ LegoBuildingInfo g_buildingInfo[16];
// GLOBAL: LEGO1 0x100f3748 // GLOBAL: LEGO1 0x100f3748
MxS32 LegoBuildingManager::g_maxMove[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0}; MxS32 LegoBuildingManager::g_maxMove[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0};
#define HAUS1_INDEX 12
// FUNCTION: LEGO1 0x1002f8b0 // FUNCTION: LEGO1 0x1002f8b0
void LegoBuildingManager::configureLegoBuildingManager(MxS32 p_buildingManagerConfig) void LegoBuildingManager::configureLegoBuildingManager(MxS32 p_buildingManagerConfig)
{ {
@ -253,10 +255,10 @@ void LegoBuildingManager::Init()
} }
m_nextVariant = 0; m_nextVariant = 0;
m_unk0x09 = FALSE; m_boundariesDetermined = FALSE;
m_numEntries = 0; m_numEntries = 0;
m_sound = NULL; m_sound = NULL;
m_unk0x28 = FALSE; m_hideAfterAnimation = FALSE;
} }
// FUNCTION: LEGO1 0x1002fa00 // FUNCTION: LEGO1 0x1002fa00
@ -274,7 +276,7 @@ void LegoBuildingManager::LoadWorldInfo()
LegoEntity* entity = (LegoEntity*) world->Find("MxEntity", g_buildingInfoVariants[0]); LegoEntity* entity = (LegoEntity*) world->Find("MxEntity", g_buildingInfoVariants[0]);
if (entity) { if (entity) {
entity->GetROI()->SetVisibility(TRUE); entity->GetROI()->SetVisibility(TRUE);
m_unk0x09 = FALSE; m_boundariesDetermined = FALSE;
} }
} }
else { else {
@ -286,7 +288,7 @@ void LegoBuildingManager::LoadWorldInfo()
} }
} }
m_unk0x09 = FALSE; m_boundariesDetermined = FALSE;
} }
// FUNCTION: LEGO1 0x1002fa90 // FUNCTION: LEGO1 0x1002fa90
@ -301,7 +303,7 @@ void LegoBuildingManager::CreateBuilding(MxS32 p_index, LegoWorld* p_world)
LegoROI* roi = entity->GetROI(); LegoROI* roi = entity->GetROI();
AdjustHeight(p_index); AdjustHeight(p_index);
MxMatrix mat = roi->GetLocal2World(); MxMatrix mat = roi->GetLocal2World();
mat[3][1] = g_buildingInfo[p_index].m_unk0x14; mat[3][1] = g_buildingInfo[p_index].m_adjustedY;
roi->UpdateTransformationRelativeToParent(mat); roi->UpdateTransformationRelativeToParent(mat);
VideoManager()->Get3DManager()->Moved(*roi); VideoManager()->Get3DManager()->Moved(*roi);
} }
@ -316,7 +318,7 @@ void LegoBuildingManager::Reset()
g_buildingInfo[i].m_entity = NULL; g_buildingInfo[i].m_entity = NULL;
} }
m_unk0x09 = FALSE; m_boundariesDetermined = FALSE;
for (i = 0; i < m_numEntries; i++) { for (i = 0; i < m_numEntries; i++) {
delete m_entries[i]; delete m_entries[i];
@ -334,21 +336,21 @@ MxResult LegoBuildingManager::Write(LegoStorage* p_storage)
for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) {
LegoBuildingInfo* info = &g_buildingInfo[i]; LegoBuildingInfo* info = &g_buildingInfo[i];
if (p_storage->Write(&info->m_sound, sizeof(info->m_sound)) != SUCCESS) { if (p_storage->Write(&info->m_sound, sizeof(MxU32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_move, sizeof(info->m_move)) != SUCCESS) { if (p_storage->Write(&info->m_move, sizeof(MxU32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { if (p_storage->Write(&info->m_mood, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_initialUnk0x11, sizeof(info->m_initialUnk0x11)) != SUCCESS) { if (p_storage->Write(&info->m_initialCounter, sizeof(MxS8)) != SUCCESS) {
goto done; goto done;
} }
} }
if (p_storage->Write(&m_nextVariant, sizeof(m_nextVariant)) != SUCCESS) { if (p_storage->Write(&m_nextVariant, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
@ -367,20 +369,20 @@ MxResult LegoBuildingManager::Read(LegoStorage* p_storage)
for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) {
LegoBuildingInfo* info = &g_buildingInfo[i]; LegoBuildingInfo* info = &g_buildingInfo[i];
if (p_storage->Read(&info->m_sound, sizeof(info->m_sound)) != SUCCESS) { if (p_storage->Read(&info->m_sound, sizeof(MxU32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_move, sizeof(info->m_move)) != SUCCESS) { if (p_storage->Read(&info->m_move, sizeof(MxU32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { if (p_storage->Read(&info->m_mood, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_unk0x11, sizeof(info->m_unk0x11)) != SUCCESS) { if (p_storage->Read(&info->m_counter, sizeof(MxS8)) != SUCCESS) {
goto done; goto done;
} }
info->m_initialUnk0x11 = info->m_unk0x11; info->m_initialCounter = info->m_counter;
AdjustHeight(i); AdjustHeight(i);
} }
@ -402,15 +404,15 @@ MxResult LegoBuildingManager::Read(LegoStorage* p_storage)
// FUNCTION: BETA10 0x10063f1a // FUNCTION: BETA10 0x10063f1a
void LegoBuildingManager::AdjustHeight(MxS32 p_index) void LegoBuildingManager::AdjustHeight(MxS32 p_index)
{ {
if (g_buildingInfo[p_index].m_unk0x11 > 0) { if (g_buildingInfo[p_index].m_counter > 0) {
float value = g_buildingInfoDownshift[p_index] - g_buildingInfo[p_index].m_unk0x11; float value = g_buildingInfoDownshift[p_index] - g_buildingInfo[p_index].m_counter;
g_buildingInfo[p_index].m_unk0x14 = g_buildingInfo[p_index].m_adjustedY =
g_buildingInfoInit[p_index].m_unk0x14 - value * g_buildingInfoDownshiftScale[p_index]; g_buildingInfoInit[p_index].m_adjustedY - value * g_buildingInfoDownshiftScale[p_index];
} }
else if (g_buildingInfo[p_index].m_unk0x11 == 0) { else if (g_buildingInfo[p_index].m_counter == 0) {
float value = g_buildingInfoDownshift[p_index] - g_buildingInfo[p_index].m_unk0x11; float value = g_buildingInfoDownshift[p_index] - g_buildingInfo[p_index].m_counter;
g_buildingInfo[p_index].m_unk0x14 = g_buildingInfo[p_index].m_adjustedY =
g_buildingInfoInit[p_index].m_unk0x14 - value * g_buildingInfoDownshiftScale[p_index]; g_buildingInfoInit[p_index].m_adjustedY - value * g_buildingInfoDownshiftScale[p_index];
if (g_buildingInfo[p_index].m_entity != NULL) { if (g_buildingInfo[p_index].m_entity != NULL) {
LegoROI* roi = g_buildingInfo[p_index].m_entity->GetROI(); LegoROI* roi = g_buildingInfo[p_index].m_entity->GetROI();
@ -420,7 +422,7 @@ void LegoBuildingManager::AdjustHeight(MxS32 p_index)
} }
} }
else { else {
g_buildingInfo[p_index].m_unk0x14 = g_buildingInfoInit[p_index].m_unk0x14; g_buildingInfo[p_index].m_adjustedY = g_buildingInfoInit[p_index].m_adjustedY;
} }
} }
@ -453,7 +455,7 @@ MxBool LegoBuildingManager::SwitchVariant(LegoEntity* p_entity)
LegoBuildingInfo* info = GetInfo(p_entity); LegoBuildingInfo* info = GetInfo(p_entity);
if (info != NULL && info->m_flags & LegoBuildingInfo::c_hasVariants && info->m_unk0x11 == -1) { if (info != NULL && info->m_flags & LegoBuildingInfo::c_hasVariants && info->m_counter == -1) {
LegoROI* roi = p_entity->GetROI(); LegoROI* roi = p_entity->GetROI();
if (++m_nextVariant >= sizeOfArray(g_buildingInfoVariants)) { if (++m_nextVariant >= sizeOfArray(g_buildingInfoVariants)) {
m_nextVariant = 0; m_nextVariant = 0;
@ -461,7 +463,7 @@ MxBool LegoBuildingManager::SwitchVariant(LegoEntity* p_entity)
roi->SetVisibility(FALSE); roi->SetVisibility(FALSE);
info->m_variant = g_buildingInfoVariants[m_nextVariant]; info->m_variant = g_buildingInfoVariants[m_nextVariant];
CreateBuilding(12, CurrentWorld()); CreateBuilding(HAUS1_INDEX, CurrentWorld());
if (info->m_entity != NULL) { if (info->m_entity != NULL) {
info->m_entity->GetROI()->SetVisibility(TRUE); info->m_entity->GetROI()->SetVisibility(TRUE);
@ -548,7 +550,7 @@ MxU32 LegoBuildingManager::GetAnimationId(LegoEntity* p_entity)
// FUNCTION: LEGO1 0x1002ff40 // FUNCTION: LEGO1 0x1002ff40
// FUNCTION: BETA10 0x10064398 // FUNCTION: BETA10 0x10064398
MxU32 LegoBuildingManager::GetSoundId(LegoEntity* p_entity, MxBool p_state) MxU32 LegoBuildingManager::GetSoundId(LegoEntity* p_entity, MxBool p_basedOnMood)
{ {
LegoBuildingInfo* info = GetInfo(p_entity); LegoBuildingInfo* info = GetInfo(p_entity);
@ -556,12 +558,12 @@ MxU32 LegoBuildingManager::GetSoundId(LegoEntity* p_entity, MxBool p_state)
return 0; return 0;
} }
if (p_state) { if (p_basedOnMood) {
return info->m_mood + g_unk0x100f3740; return info->m_mood + g_buildingSoundIdMoodOffset;
} }
if (info != NULL) { if (info != NULL) {
return info->m_sound + g_unk0x100f373c; return info->m_sound + g_buildingSoundIdOffset;
} }
return 0; return 0;
@ -587,7 +589,7 @@ void LegoBuildingManager::SetCustomizeAnimFile(const char* p_value)
} }
// FUNCTION: LEGO1 0x10030000 // FUNCTION: LEGO1 0x10030000
MxBool LegoBuildingManager::FUN_10030000(LegoEntity* p_entity) MxBool LegoBuildingManager::DecrementCounter(LegoEntity* p_entity)
{ {
LegoBuildingInfo* info = GetInfo(p_entity); LegoBuildingInfo* info = GetInfo(p_entity);
@ -595,7 +597,7 @@ MxBool LegoBuildingManager::FUN_10030000(LegoEntity* p_entity)
return FALSE; return FALSE;
} }
return FUN_10030030(info - g_buildingInfo); return DecrementCounter(info - g_buildingInfo);
} }
inline LegoBuildingInfo* GetBuildingInfo(MxS32 p_index) inline LegoBuildingInfo* GetBuildingInfo(MxS32 p_index)
@ -608,7 +610,7 @@ inline LegoBuildingInfo* GetBuildingInfo(MxS32 p_index)
} }
// FUNCTION: LEGO1 0x10030030 // FUNCTION: LEGO1 0x10030030
MxBool LegoBuildingManager::FUN_10030030(MxS32 p_index) MxBool LegoBuildingManager::DecrementCounter(MxS32 p_index)
{ {
if (p_index >= sizeOfArray(g_buildingInfo)) { if (p_index >= sizeOfArray(g_buildingInfo)) {
return FALSE; return FALSE;
@ -621,25 +623,25 @@ MxBool LegoBuildingManager::FUN_10030030(MxS32 p_index)
MxBool result = TRUE; MxBool result = TRUE;
if (info->m_unk0x11 < 0) { if (info->m_counter < 0) {
info->m_unk0x11 = g_buildingInfoDownshift[p_index]; info->m_counter = g_buildingInfoDownshift[p_index];
} }
if (info->m_unk0x11 <= 0) { if (info->m_counter <= 0) {
result = FALSE; result = FALSE;
} }
else { else {
LegoROI* roi = info->m_entity->GetROI(); LegoROI* roi = info->m_entity->GetROI();
info->m_unk0x11 -= 2; info->m_counter -= 2;
if (info->m_unk0x11 == 1) { if (info->m_counter == 1) {
info->m_unk0x11 = 0; info->m_counter = 0;
roi->SetVisibility(FALSE); roi->SetVisibility(FALSE);
} }
else { else {
AdjustHeight(p_index); AdjustHeight(p_index);
MxMatrix mat = roi->GetLocal2World(); MxMatrix mat = roi->GetLocal2World();
mat[3][1] = g_buildingInfo[p_index].m_unk0x14; mat[3][1] = g_buildingInfo[p_index].m_adjustedY;
roi->UpdateTransformationRelativeToParent(mat); roi->UpdateTransformationRelativeToParent(mat);
VideoManager()->Get3DManager()->Moved(*roi); VideoManager()->Get3DManager()->Moved(*roi);
} }
@ -649,11 +651,11 @@ MxBool LegoBuildingManager::FUN_10030030(MxS32 p_index)
} }
// FUNCTION: LEGO1 0x10030110 // FUNCTION: LEGO1 0x10030110
MxBool LegoBuildingManager::FUN_10030110(LegoBuildingInfo* p_data) MxBool LegoBuildingManager::DecrementCounter(LegoBuildingInfo* p_data)
{ {
for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) {
if (&g_buildingInfo[i] == p_data) { if (&g_buildingInfo[i] == p_data) {
return FUN_10030030(i); return DecrementCounter(i);
} }
} }
@ -661,7 +663,12 @@ MxBool LegoBuildingManager::FUN_10030110(LegoBuildingInfo* p_data)
} }
// FUNCTION: LEGO1 0x10030150 // FUNCTION: LEGO1 0x10030150
void LegoBuildingManager::ScheduleAnimation(LegoEntity* p_entity, MxLong p_length, MxBool p_haveSound, MxBool p_unk0x28) void LegoBuildingManager::ScheduleAnimation(
LegoEntity* p_entity,
MxLong p_length,
MxBool p_haveSound,
MxBool p_hideAfterAnimation
)
{ {
m_world = CurrentWorld(); m_world = CurrentWorld();
@ -671,7 +678,7 @@ void LegoBuildingManager::ScheduleAnimation(LegoEntity* p_entity, MxLong p_lengt
} }
if (m_numEntries == 0) { if (m_numEntries == 0) {
m_unk0x28 = p_unk0x28; m_hideAfterAnimation = p_hideAfterAnimation;
TickleManager()->RegisterClient(this, 50); TickleManager()->RegisterClient(this, 50);
} }
@ -685,9 +692,9 @@ void LegoBuildingManager::ScheduleAnimation(LegoEntity* p_entity, MxLong p_lengt
time += p_length; time += p_length;
entry->m_time = time + 1000; entry->m_time = time + 1000;
entry->m_unk0x0c = entry->m_roi->GetWorldPosition()[1]; entry->m_y = entry->m_roi->GetWorldPosition()[1];
entry->m_muted = p_haveSound == FALSE; entry->m_muted = p_haveSound == FALSE;
FUN_100307b0(p_entity, -2); AdjustCounter(p_entity, -2);
} }
// FUNCTION: LEGO1 0x10030220 // FUNCTION: LEGO1 0x10030220
@ -724,33 +731,33 @@ MxResult LegoBuildingManager::Tickle()
MxMatrix local48; MxMatrix local48;
MxMatrix locald8; MxMatrix locald8;
MxMatrix local120(entry->m_roi->GetLocal2World()); MxMatrix transformationMatrix(entry->m_roi->GetLocal2World());
Mx3DPointFloat local134(local120[3]); Mx3DPointFloat position(transformationMatrix[3]);
ZEROVEC3(local120[3]); ZEROVEC3(transformationMatrix[3]);
locald8.SetIdentity(); locald8.SetIdentity();
local48 = local120; local48 = transformationMatrix;
local134[1] = sin(((entry->m_time - time) * 10) * 0.0062831999f) * 0.4 + (entry->m_unk0x0c -= 0.05); position[1] = sin(((entry->m_time - time) * 10) * 0.0062831999f) * 0.4 + (entry->m_y -= 0.05);
SET3(local120[3], local134); SET3(transformationMatrix[3], position);
entry->m_roi->UpdateTransformationRelativeToParent(local120); entry->m_roi->UpdateTransformationRelativeToParent(transformationMatrix);
VideoManager()->Get3DManager()->Moved(*entry->m_roi); VideoManager()->Get3DManager()->Moved(*entry->m_roi);
if (entry->m_time < time) { if (entry->m_time < time) {
LegoBuildingInfo* info = GetInfo(entry->m_entity); LegoBuildingInfo* info = GetInfo(entry->m_entity);
if (info->m_unk0x11 && !m_unk0x28) { if (info->m_counter && !m_hideAfterAnimation) {
MxS32 index = info - g_buildingInfo; MxS32 index = info - g_buildingInfo;
AdjustHeight(index); AdjustHeight(index);
MxMatrix mat = entry->m_roi->GetLocal2World(); MxMatrix mat = entry->m_roi->GetLocal2World();
mat[3][1] = g_buildingInfo[index].m_unk0x14; mat[3][1] = g_buildingInfo[index].m_adjustedY;
entry->m_roi->UpdateTransformationRelativeToParent(mat); entry->m_roi->UpdateTransformationRelativeToParent(mat);
VideoManager()->Get3DManager()->Moved(*entry->m_roi); VideoManager()->Get3DManager()->Moved(*entry->m_roi);
} }
else { else {
info->m_unk0x11 = 0; info->m_counter = 0;
entry->m_roi->SetVisibility(FALSE); entry->m_roi->SetVisibility(FALSE);
} }
@ -774,17 +781,17 @@ MxResult LegoBuildingManager::Tickle()
// FUNCTION: LEGO1 0x10030590 // FUNCTION: LEGO1 0x10030590
// FUNCTION: BETA10 0x1006474c // FUNCTION: BETA10 0x1006474c
void LegoBuildingManager::FUN_10030590() void LegoBuildingManager::ClearCounters()
{ {
for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_buildingInfo); i++) {
g_buildingInfo[i].m_unk0x11 = -1; g_buildingInfo[i].m_counter = -1;
g_buildingInfo[i].m_initialUnk0x11 = -1; g_buildingInfo[i].m_initialCounter = -1;
AdjustHeight(i); AdjustHeight(i);
if (g_buildingInfo[i].m_entity != NULL) { if (g_buildingInfo[i].m_entity != NULL) {
LegoROI* roi = g_buildingInfo[i].m_entity->GetROI(); LegoROI* roi = g_buildingInfo[i].m_entity->GetROI();
MxMatrix mat = roi->GetLocal2World(); MxMatrix mat = roi->GetLocal2World();
mat[3][1] = g_buildingInfo[i].m_unk0x14; mat[3][1] = g_buildingInfo[i].m_adjustedY;
roi->UpdateTransformationRelativeToParent(mat); roi->UpdateTransformationRelativeToParent(mat);
VideoManager()->Get3DManager()->Moved(*roi); VideoManager()->Get3DManager()->Moved(*roi);
} }
@ -793,7 +800,7 @@ void LegoBuildingManager::FUN_10030590()
// FUNCTION: LEGO1 0x10030630 // FUNCTION: LEGO1 0x10030630
// FUNCTION: BETA10 0x100648ab // FUNCTION: BETA10 0x100648ab
MxResult LegoBuildingManager::FUN_10030630() MxResult LegoBuildingManager::DetermineBoundaries()
{ {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
@ -827,7 +834,7 @@ MxResult LegoBuildingManager::FUN_10030630()
} }
if (g_buildingInfo[i].m_boundary != NULL) { if (g_buildingInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_buildingInfo[i].m_boundary->GetUnknown0x14(); Mx4DPointFloat& unk0x14 = *g_buildingInfo[i].m_boundary->GetUp();
if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 || if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 ||
position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) { position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) {
@ -859,7 +866,7 @@ MxResult LegoBuildingManager::FUN_10030630()
} }
} }
m_unk0x09 = TRUE; m_boundariesDetermined = TRUE;
return SUCCESS; return SUCCESS;
} }
@ -867,8 +874,8 @@ MxResult LegoBuildingManager::FUN_10030630()
// FUNCTION: BETA10 0x10064db9 // FUNCTION: BETA10 0x10064db9
LegoBuildingInfo* LegoBuildingManager::GetInfoArray(MxS32& p_length) LegoBuildingInfo* LegoBuildingManager::GetInfoArray(MxS32& p_length)
{ {
if (!m_unk0x09) { if (!m_boundariesDetermined) {
FUN_10030630(); DetermineBoundaries();
} }
p_length = sizeOfArray(g_buildingInfo); p_length = sizeOfArray(g_buildingInfo);
@ -876,28 +883,28 @@ LegoBuildingInfo* LegoBuildingManager::GetInfoArray(MxS32& p_length)
} }
// FUNCTION: LEGO1 0x100307b0 // FUNCTION: LEGO1 0x100307b0
void LegoBuildingManager::FUN_100307b0(LegoEntity* p_entity, MxS32 p_adjust) void LegoBuildingManager::AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust)
{ {
LegoBuildingInfo* info = GetInfo(p_entity); LegoBuildingInfo* info = GetInfo(p_entity);
if (info != NULL) { if (info != NULL) {
if (info->m_unk0x11 < 0) { if (info->m_counter < 0) {
info->m_unk0x11 = g_buildingInfoDownshift[info - g_buildingInfo]; info->m_counter = g_buildingInfoDownshift[info - g_buildingInfo];
} }
if (info->m_unk0x11 > 0) { if (info->m_counter > 0) {
info->m_unk0x11 += p_adjust; info->m_counter += p_adjust;
if (info->m_unk0x11 <= 1 && p_adjust < 0) { if (info->m_counter <= 1 && p_adjust < 0) {
info->m_unk0x11 = 0; info->m_counter = 0;
} }
} }
} }
} }
// FUNCTION: LEGO1 0x10030800 // FUNCTION: LEGO1 0x10030800
void LegoBuildingManager::FUN_10030800() void LegoBuildingManager::SetInitialCounters()
{ {
for (MxU32 i = 0; i < sizeOfArray(g_buildingInfo); i++) { for (MxU32 i = 0; i < sizeOfArray(g_buildingInfo); i++) {
g_buildingInfo[i].m_initialUnk0x11 = g_buildingInfo[i].m_unk0x11; g_buildingInfo[i].m_initialCounter = g_buildingInfo[i].m_counter;
} }
} }

View File

@ -37,19 +37,19 @@ MxU32 g_characterAnimationId = 10;
char* LegoCharacterManager::g_customizeAnimFile = NULL; char* LegoCharacterManager::g_customizeAnimFile = NULL;
// GLOBAL: LEGO1 0x100fc4d8 // GLOBAL: LEGO1 0x100fc4d8
MxU32 g_unk0x100fc4d8 = 50; MxU32 g_characterSoundIdOffset = 50;
// GLOBAL: LEGO1 0x100fc4dc // GLOBAL: LEGO1 0x100fc4dc
MxU32 g_unk0x100fc4dc = 66; MxU32 g_characterSoundIdMoodOffset = 66;
// GLOBAL: LEGO1 0x100fc4e8 // GLOBAL: LEGO1 0x100fc4e8
MxU32 g_unk0x100fc4e8 = 0; MxU32 g_headTextureCounter = 0;
// GLOBAL: LEGO1 0x100fc4ec // GLOBAL: LEGO1 0x100fc4ec
MxU32 g_unk0x100fc4ec = 2; MxU32 g_infohatVariantCounter = 2;
// GLOBAL: LEGO1 0x100fc4f0 // GLOBAL: LEGO1 0x100fc4f0
MxU32 g_unk0x100fc4f0 = 0; MxU32 g_autoRoiCounter = 0;
// GLOBAL: LEGO1 0x10104f20 // GLOBAL: LEGO1 0x10104f20
LegoActorInfo g_actorInfo[66]; LegoActorInfo g_actorInfo[66];
@ -132,33 +132,41 @@ MxResult LegoCharacterManager::Write(LegoStorage* p_storage)
if (p_storage->Write(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { if (p_storage->Write(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(info->m_parts[c_infohatPart].m_unk0x08)) != if (p_storage->Write(
SUCCESS) { &info->m_parts[c_infohatPart].m_partNameIndex,
sizeof(info->m_parts[c_infohatPart].m_partNameIndex)
) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_parts[c_infohatPart].m_unk0x14, sizeof(info->m_parts[c_infohatPart].m_unk0x14)) != if (p_storage->Write(
&info->m_parts[c_infohatPart].m_nameIndex,
sizeof(info->m_parts[c_infohatPart].m_nameIndex)
) != SUCCESS) {
goto done;
}
if (p_storage->Write(
&info->m_parts[c_infogronPart].m_nameIndex,
sizeof(info->m_parts[c_infogronPart].m_nameIndex)
) != SUCCESS) {
goto done;
}
if (p_storage->Write(
&info->m_parts[c_armlftPart].m_nameIndex,
sizeof(info->m_parts[c_armlftPart].m_nameIndex)
) != SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_armrtPart].m_nameIndex, sizeof(info->m_parts[c_armrtPart].m_nameIndex)) !=
SUCCESS) { SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write( if (p_storage->Write(
&info->m_parts[c_infogronPart].m_unk0x14, &info->m_parts[c_leglftPart].m_nameIndex,
sizeof(info->m_parts[c_infogronPart].m_unk0x14) sizeof(info->m_parts[c_leglftPart].m_nameIndex)
) != SUCCESS) { ) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_parts[c_armlftPart].m_unk0x14, sizeof(info->m_parts[c_armlftPart].m_unk0x14)) != if (p_storage->Write(&info->m_parts[c_legrtPart].m_nameIndex, sizeof(info->m_parts[c_legrtPart].m_nameIndex)) !=
SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_armrtPart].m_unk0x14, sizeof(info->m_parts[c_armrtPart].m_unk0x14)) !=
SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_leglftPart].m_unk0x14, sizeof(info->m_parts[c_leglftPart].m_unk0x14)) !=
SUCCESS) {
goto done;
}
if (p_storage->Write(&info->m_parts[c_legrtPart].m_unk0x14, sizeof(info->m_parts[c_legrtPart].m_unk0x14)) !=
SUCCESS) { SUCCESS) {
goto done; goto done;
} }
@ -178,43 +186,34 @@ MxResult LegoCharacterManager::Read(LegoStorage* p_storage)
for (MxS32 i = 0; i < sizeOfArray(g_actorInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_actorInfo); i++) {
LegoActorInfo* info = &g_actorInfo[i]; LegoActorInfo* info = &g_actorInfo[i];
if (p_storage->Read(&info->m_sound, sizeof(info->m_sound)) != SUCCESS) { if (p_storage->Read(&info->m_sound, sizeof(MxS32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_move, sizeof(info->m_move)) != SUCCESS) { if (p_storage->Read(&info->m_move, sizeof(MxS32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { if (p_storage->Read(&info->m_mood, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(info->m_parts[c_infohatPart].m_unk0x08)) != if (p_storage->Read(&info->m_parts[c_infohatPart].m_partNameIndex, sizeof(MxU8)) != SUCCESS) {
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_infohatPart].m_unk0x14, sizeof(info->m_parts[c_infohatPart].m_unk0x14)) != if (p_storage->Read(&info->m_parts[c_infohatPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read( if (p_storage->Read(&info->m_parts[c_infogronPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
&info->m_parts[c_infogronPart].m_unk0x14,
sizeof(info->m_parts[c_infogronPart].m_unk0x14)
) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_armlftPart].m_unk0x14, sizeof(info->m_parts[c_armlftPart].m_unk0x14)) != if (p_storage->Read(&info->m_parts[c_armlftPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_armrtPart].m_unk0x14, sizeof(info->m_parts[c_armrtPart].m_unk0x14)) != if (p_storage->Read(&info->m_parts[c_armrtPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_leglftPart].m_unk0x14, sizeof(info->m_parts[c_leglftPart].m_unk0x14)) != if (p_storage->Read(&info->m_parts[c_leglftPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_parts[c_legrtPart].m_unk0x14, sizeof(info->m_parts[c_legrtPart].m_unk0x14)) != if (p_storage->Read(&info->m_parts[c_legrtPart].m_nameIndex, sizeof(MxU8)) != SUCCESS) {
SUCCESS) {
goto done; goto done;
} }
} }
@ -501,7 +500,7 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
boundingBox.Max()[0] = g_actorLODs[c_topLOD].m_boundingBox[3]; boundingBox.Max()[0] = g_actorLODs[c_topLOD].m_boundingBox[3];
boundingBox.Max()[1] = g_actorLODs[c_topLOD].m_boundingBox[4]; boundingBox.Max()[1] = g_actorLODs[c_topLOD].m_boundingBox[4];
boundingBox.Max()[2] = g_actorLODs[c_topLOD].m_boundingBox[5]; boundingBox.Max()[2] = g_actorLODs[c_topLOD].m_boundingBox[5];
roi->SetUnknown0x80(boundingBox); roi->SetBoundingBox(boundingBox);
comp = new CompoundObject(); comp = new CompoundObject();
roi->SetComp(comp); roi->SetComp(comp);
@ -512,7 +511,7 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
const char* parentName; const char* parentName;
if (i == 0 || i == 1) { if (i == 0 || i == 1) {
parentName = part.m_unk0x04[part.m_unk0x00[part.m_unk0x08]]; parentName = part.m_partName[part.m_partNameIndices[part.m_partNameIndex]];
} }
else { else {
parentName = g_actorLODs[i + 1].m_parentName; parentName = g_actorLODs[i + 1].m_parentName;
@ -552,7 +551,7 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
childBoundingBox.Max()[0] = g_actorLODs[i + 1].m_boundingBox[3]; childBoundingBox.Max()[0] = g_actorLODs[i + 1].m_boundingBox[3];
childBoundingBox.Max()[1] = g_actorLODs[i + 1].m_boundingBox[4]; childBoundingBox.Max()[1] = g_actorLODs[i + 1].m_boundingBox[4];
childBoundingBox.Max()[2] = g_actorLODs[i + 1].m_boundingBox[5]; childBoundingBox.Max()[2] = g_actorLODs[i + 1].m_boundingBox[5];
childROI->SetUnknown0x80(childBoundingBox); childROI->SetBoundingBox(childBoundingBox);
CalcLocalTransform( CalcLocalTransform(
Mx3DPointFloat(g_actorLODs[i + 1].m_position), Mx3DPointFloat(g_actorLODs[i + 1].m_position),
@ -560,21 +559,22 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
Mx3DPointFloat(g_actorLODs[i + 1].m_up), Mx3DPointFloat(g_actorLODs[i + 1].m_up),
mat mat
); );
childROI->WrappedSetLocalTransform(mat); childROI->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_flag1 && (i != 0 || part.m_unk0x00[part.m_unk0x08] != 0)) { if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_useTexture &&
(i != 0 || part.m_partNameIndices[part.m_partNameIndex] != 0)) {
LegoTextureInfo* textureInfo = textureContainer->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]); LegoTextureInfo* textureInfo = textureContainer->Get(part.m_names[part.m_nameIndices[part.m_nameIndex]]);
if (textureInfo != NULL) { if (textureInfo != NULL) {
childROI->FUN_100a9210(textureInfo); childROI->SetTextureInfo(textureInfo);
childROI->FUN_100a9170(1.0F, 1.0F, 1.0F, 0.0F); childROI->SetLodColor(1.0F, 1.0F, 1.0F, 0.0F);
} }
} }
else if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_flag2 || (i == 0 && part.m_unk0x00[part.m_unk0x08] == 0)) { else if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_useColor || (i == 0 && part.m_partNameIndices[part.m_partNameIndex] == 0)) {
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
childROI->FUN_100a9bf0(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); childROI->GetRGBAColor(part.m_names[part.m_nameIndices[part.m_nameIndex]], red, green, blue, alpha);
childROI->FUN_100a9170(red, green, blue, alpha); childROI->SetLodColor(red, green, blue, alpha);
} }
comp->push_back(childROI); comp->push_back(childROI);
@ -586,7 +586,7 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
Mx3DPointFloat(g_actorLODs[c_topLOD].m_up), Mx3DPointFloat(g_actorLODs[c_topLOD].m_up),
mat mat
); );
roi->WrappedSetLocalTransform(mat); roi->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
info->m_roi = roi; info->m_roi = roi;
success = TRUE; success = TRUE;
@ -602,7 +602,7 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
// FUNCTION: LEGO1 0x100849a0 // FUNCTION: LEGO1 0x100849a0
// FUNCTION: BETA10 0x10075b51 // FUNCTION: BETA10 0x10075b51
MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_texture) MxBool LegoCharacterManager::SetHeadTexture(LegoROI* p_roi, LegoTextureInfo* p_texture)
{ {
LegoResult result = SUCCESS; LegoResult result = SUCCESS;
LegoROI* head = FindChildROI(p_roi, g_actorLODs[c_headLOD].m_name); LegoROI* head = FindChildROI(p_roi, g_actorLODs[c_headLOD].m_name);
@ -614,7 +614,7 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
assert(lodList); assert(lodList);
MxS32 lodSize = lodList->Size(); MxS32 lodSize = lodList->Size();
sprintf(lodName, "%s%s%d", p_roi->GetName(), "head", g_unk0x100fc4e8++); sprintf(lodName, "%s%s%d", p_roi->GetName(), "head", g_headTextureCounter++);
ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize); ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize);
assert(dupLodList); assert(dupLodList);
@ -625,7 +625,7 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
assert(info); assert(info);
LegoActorInfo::Part& part = info->m_parts[c_headPart]; LegoActorInfo::Part& part = info->m_parts[c_headPart];
p_texture = TextureContainer()->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]); p_texture = TextureContainer()->Get(part.m_names[part.m_nameIndices[part.m_nameIndex]]);
assert(p_texture); assert(p_texture);
} }
@ -634,7 +634,7 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
LegoLOD* clone = lod->Clone(renderer); LegoLOD* clone = lod->Clone(renderer);
if (p_texture != NULL) { if (p_texture != NULL) {
clone->FUN_100aad70(p_texture); clone->UpdateTextureInfo(p_texture);
} }
dupLodList->PushBack(clone); dupLodList->PushBack(clone);
@ -643,7 +643,7 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
lodList->Release(); lodList->Release();
lodList = dupLodList; lodList = dupLodList;
if (head->GetUnknown0xe0() >= 0) { if (head->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(head); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(head);
} }
@ -758,23 +758,23 @@ MxBool LegoCharacterManager::SwitchColor(LegoROI* p_roi, LegoROI* p_targetROI)
assert(partIndex < numParts); assert(partIndex < numParts);
MxBool findChild = TRUE; MxBool findChild = TRUE;
if (partIndex == 6) { if (partIndex == c_clawlftPart) {
partIndex = 4; partIndex = c_armlftPart;
} }
else if (partIndex == 7) { else if (partIndex == c_clawrtPart) {
partIndex = 5; partIndex = c_armrtPart;
} }
else if (partIndex == 3) { else if (partIndex == c_headPart) {
partIndex = 1; partIndex = c_infohatPart;
} }
else if (partIndex == 0) { else if (partIndex == c_bodyPart) {
partIndex = 2; partIndex = c_infogronPart;
} }
else { else {
findChild = FALSE; findChild = FALSE;
} }
if (!(g_actorLODs[partIndex + 1].m_flags & LegoActorLOD::c_flag2)) { if (!(g_actorLODs[partIndex + 1].m_flags & LegoActorLOD::c_useColor)) {
return FALSE; return FALSE;
} }
@ -790,14 +790,14 @@ MxBool LegoCharacterManager::SwitchColor(LegoROI* p_roi, LegoROI* p_targetROI)
LegoActorInfo::Part& part = info->m_parts[partIndex]; LegoActorInfo::Part& part = info->m_parts[partIndex];
part.m_unk0x14++; part.m_nameIndex++;
if (part.m_unk0x0c[part.m_unk0x14] == 0xff) { if (part.m_nameIndices[part.m_nameIndex] == 0xff) {
part.m_unk0x14 = 0; part.m_nameIndex = 0;
} }
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
LegoROI::FUN_100a9bf0(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); LegoROI::GetRGBAColor(part.m_names[part.m_nameIndices[part.m_nameIndex]], red, green, blue, alpha);
p_targetROI->FUN_100a9170(red, green, blue, alpha); p_targetROI->SetLodColor(red, green, blue, alpha);
return TRUE; return TRUE;
} }
@ -812,12 +812,12 @@ MxBool LegoCharacterManager::SwitchVariant(LegoROI* p_roi)
LegoActorInfo::Part& part = info->m_parts[c_infohatPart]; LegoActorInfo::Part& part = info->m_parts[c_infohatPart];
part.m_unk0x08++; part.m_partNameIndex++;
MxU8 unk0x00 = part.m_unk0x00[part.m_unk0x08]; MxU8 partNameIndex = part.m_partNameIndices[part.m_partNameIndex];
if (unk0x00 == 0xff) { if (partNameIndex == 0xff) {
part.m_unk0x08 = 0; part.m_partNameIndex = 0;
unk0x00 = part.m_unk0x00[part.m_unk0x08]; partNameIndex = part.m_partNameIndices[part.m_partNameIndex];
} }
LegoROI* childROI = FindChildROI(p_roi, g_actorLODs[c_infohatLOD].m_name); LegoROI* childROI = FindChildROI(p_roi, g_actorLODs[c_infohatLOD].m_name);
@ -825,26 +825,26 @@ MxBool LegoCharacterManager::SwitchVariant(LegoROI* p_roi)
if (childROI != NULL) { if (childROI != NULL) {
char lodName[256]; char lodName[256];
ViewLODList* lodList = GetViewLODListManager()->Lookup(part.m_unk0x04[unk0x00]); ViewLODList* lodList = GetViewLODListManager()->Lookup(part.m_partName[partNameIndex]);
MxS32 lodSize = lodList->Size(); MxS32 lodSize = lodList->Size();
sprintf(lodName, "%s%d", p_roi->GetName(), g_unk0x100fc4ec++); sprintf(lodName, "%s%d", p_roi->GetName(), g_infohatVariantCounter++);
ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize); ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize);
Tgl::Renderer* renderer = VideoManager()->GetRenderer(); Tgl::Renderer* renderer = VideoManager()->GetRenderer();
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
LegoROI::FUN_100a9bf0(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); LegoROI::GetRGBAColor(part.m_names[part.m_nameIndices[part.m_nameIndex]], red, green, blue, alpha);
for (MxS32 i = 0; i < lodSize; i++) { for (MxS32 i = 0; i < lodSize; i++) {
LegoLOD* lod = (LegoLOD*) (*lodList)[i]; LegoLOD* lod = (LegoLOD*) (*lodList)[i];
LegoLOD* clone = lod->Clone(renderer); LegoLOD* clone = lod->Clone(renderer);
clone->FUN_100aacb0(red, green, blue, alpha); clone->SetColor(red, green, blue, alpha);
dupLodList->PushBack(clone); dupLodList->PushBack(clone);
} }
lodList->Release(); lodList->Release();
lodList = dupLodList; lodList = dupLodList;
if (childROI->GetUnknown0xe0() >= 0) { if (childROI->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(childROI); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(childROI);
} }
@ -931,16 +931,16 @@ MxU32 LegoCharacterManager::GetAnimationId(LegoROI* p_roi)
// FUNCTION: LEGO1 0x10085140 // FUNCTION: LEGO1 0x10085140
// FUNCTION: BETA10 0x10076855 // FUNCTION: BETA10 0x10076855
MxU32 LegoCharacterManager::GetSoundId(LegoROI* p_roi, MxBool p_und) MxU32 LegoCharacterManager::GetSoundId(LegoROI* p_roi, MxBool p_basedOnMood)
{ {
LegoActorInfo* info = GetActorInfo(p_roi); LegoActorInfo* info = GetActorInfo(p_roi);
if (p_und) { if (p_basedOnMood) {
return info->m_mood + g_unk0x100fc4dc; return info->m_mood + g_characterSoundIdMoodOffset;
} }
if (info != NULL) { if (info != NULL) {
return info->m_sound + g_unk0x100fc4d8; return info->m_sound + g_characterSoundIdOffset;
} }
else { else {
return 0; return 0;
@ -1005,14 +1005,14 @@ LegoROI* LegoCharacterManager::CreateAutoROI(const char* p_name, const char* p_l
name = p_name; name = p_name;
} }
else { else {
sprintf(buf, "autoROI_%d", g_unk0x100fc4f0++); sprintf(buf, "autoROI_%d", g_autoRoiCounter++);
name = buf; name = buf;
} }
roi->SetName(name); roi->SetName(name);
lodList->Release(); lodList->Release();
if (roi != NULL && FUN_10085870(roi) != SUCCESS) { if (roi != NULL && UpdateBoundingSphereAndBox(roi) != SUCCESS) {
delete roi; delete roi;
roi = NULL; roi = NULL;
} }
@ -1042,7 +1042,7 @@ LegoROI* LegoCharacterManager::CreateAutoROI(const char* p_name, const char* p_l
} }
// FUNCTION: LEGO1 0x10085870 // FUNCTION: LEGO1 0x10085870
MxResult LegoCharacterManager::FUN_10085870(LegoROI* p_roi) MxResult LegoCharacterManager::UpdateBoundingSphereAndBox(LegoROI* p_roi)
{ {
MxResult result = FAILURE; MxResult result = FAILURE;
@ -1073,9 +1073,9 @@ MxResult LegoCharacterManager::FUN_10085870(LegoROI* p_roi)
SET3(boundingBox.Min(), min); SET3(boundingBox.Min(), min);
SET3(boundingBox.Max(), max); SET3(boundingBox.Max(), max);
p_roi->SetUnknown0x80(boundingBox); p_roi->SetBoundingBox(boundingBox);
p_roi->VTable0x14(); p_roi->WrappedUpdateWorldData();
result = SUCCESS; result = SUCCESS;
} }

View File

@ -99,14 +99,14 @@ ColorStringStruct g_colorSaveData[43] = {
{"c_chljety1", "lego black"}, {"c_chrjety1", "lego black"}, // copter left jet, copter right jet {"c_chljety1", "lego black"}, {"c_chrjety1", "lego black"}, // copter left jet, copter right jet
{"c_chmidly0", "lego black"}, {"c_chmotry0", "lego blue"}, // copter middle, copter motor {"c_chmidly0", "lego black"}, {"c_chmotry0", "lego blue"}, // copter middle, copter motor
{"c_chsidly0", "lego black"}, {"c_chsidry0", "lego black"}, // copter side left, copter side right {"c_chsidly0", "lego black"}, {"c_chsidry0", "lego black"}, // copter side left, copter side right
{"c_chstuty0", "lego black"}, {"c_chtaily0", "lego black"}, // copter ???, copter tail {"c_chstuty0", "lego black"}, {"c_chtaily0", "lego black"}, // copter skids, copter tail
{"c_chwindy1", "lego black"}, {"c_dbfbrdy0", "lego red"}, // copter ???, dunebuggy ??? {"c_chwindy1", "lego black"}, {"c_dbfbrdy0", "lego red"}, // copter windshield, dunebuggy body
{"c_dbflagy0", "lego yellow"}, {"c_dbfrfny4", "lego red"}, // dunebuggy flag, dunebuggy front fender {"c_dbflagy0", "lego yellow"}, {"c_dbfrfny4", "lego red"}, // dunebuggy flag, dunebuggy front fender
{"c_dbfrxly0", "lego white"}, {"c_dbhndly0", "lego white"}, // dunebuggy front axle, dunebuggy handlebar {"c_dbfrxly0", "lego white"}, {"c_dbhndly0", "lego white"}, // dunebuggy front axle, dunebuggy handlebar
{"c_dbltbry0", "lego white"}, {"c_jsdashy0", "lego white"}, // dunebuggy ???, jetski dash {"c_dbltbry0", "lego white"}, {"c_jsdashy0", "lego white"}, // dunebuggy rear lights, jetski dash
{"c_jsexhy0", "lego black"}, {"c_jsfrnty5", "lego black"}, // jetski exhaust, jetski front {"c_jsexhy0", "lego black"}, {"c_jsfrnty5", "lego black"}, // jetski exhaust, jetski front
{"c_jshndly0", "lego red"}, {"c_jslsidy0", "lego black"}, // jetski handlebar, jetski left side {"c_jshndly0", "lego red"}, {"c_jslsidy0", "lego black"}, // jetski handlebar, jetski left side
{"c_jsrsidy0", "lego black"}, {"c_jsskiby0", "lego red"}, // jetski right side, jetski ??? {"c_jsrsidy0", "lego black"}, {"c_jsskiby0", "lego red"}, // jetski right side, jetski base
{"c_jswnshy5", "lego white"}, {"c_rcbacky6", "lego green"}, // jetski windshield, racecar back {"c_jswnshy5", "lego white"}, {"c_rcbacky6", "lego green"}, // jetski windshield, racecar back
{"c_rcedgey0", "lego green"}, {"c_rcfrmey0", "lego red"}, // racecar edge, racecar frame {"c_rcedgey0", "lego green"}, {"c_rcfrmey0", "lego red"}, // racecar edge, racecar frame
{"c_rcfrnty6", "lego green"}, {"c_rcmotry0", "lego white"}, // racecar front, racecar motor {"c_rcfrnty6", "lego green"}, {"c_rcmotry0", "lego white"}, // racecar front, racecar motor
@ -145,7 +145,7 @@ const char* g_strDisable = "disable";
LegoGameState::LegoGameState() LegoGameState::LegoGameState()
{ {
SetColors(); SetColors();
SetROIHandlerFunction(); SetROIColorOverride();
m_stateCount = 0; m_stateCount = 0;
m_actorId = 0; m_actorId = 0;
@ -170,13 +170,13 @@ LegoGameState::LegoGameState()
VariableTable()->SetVariable(m_fullScreenMovie); VariableTable()->SetVariable(m_fullScreenMovie);
VariableTable()->SetVariable("lightposition", "2"); VariableTable()->SetVariable("lightposition", "2");
SerializeScoreHistory(1); SerializeScoreHistory(LegoFile::c_read);
} }
// FUNCTION: LEGO1 0x10039720 // FUNCTION: LEGO1 0x10039720
LegoGameState::~LegoGameState() LegoGameState::~LegoGameState()
{ {
LegoROI::FUN_100a9d30(NULL); LegoROI::SetColorOverride(NULL);
if (m_stateCount) { if (m_stateCount) {
for (MxS16 i = 0; i < m_stateCount; i++) { for (MxS16 i = 0; i < m_stateCount; i++) {
@ -215,7 +215,7 @@ void LegoGameState::SetActor(MxU8 p_actorId)
newActor->SetROI(roi, FALSE, FALSE); newActor->SetROI(roi, FALSE, FALSE);
if (oldActor) { if (oldActor) {
newActor->GetROI()->FUN_100a58f0(oldActor->GetROI()->GetLocal2World()); newActor->GetROI()->SetLocal2World(oldActor->GetROI()->GetLocal2World());
newActor->SetBoundary(oldActor->GetBoundary()); newActor->SetBoundary(oldActor->GetBoundary());
delete oldActor; delete oldActor;
} }
@ -277,7 +277,7 @@ MxResult LegoGameState::Save(MxULong p_slot)
} }
storage.WriteS32(0x1000c); storage.WriteS32(0x1000c);
storage.WriteS16(m_unk0x24); storage.WriteS16(m_currentPlayerId);
storage.WriteU16(m_currentAct); storage.WriteU16(m_currentAct);
storage.WriteU8(m_actorId); storage.WriteU8(m_actorId);
@ -315,7 +315,7 @@ MxResult LegoGameState::Save(MxULong p_slot)
area = m_unk0x42c; area = m_unk0x42c;
storage.WriteU16(area); storage.WriteU16(area);
SerializeScoreHistory(2); SerializeScoreHistory(LegoFile::c_write);
m_isDirty = FALSE; m_isDirty = FALSE;
done: done:
@ -372,7 +372,7 @@ MxResult LegoGameState::Load(MxULong p_slot)
goto done; goto done;
} }
storage.ReadS16(m_unk0x24); storage.ReadS16(m_currentPlayerId);
storage.ReadS16(actArea); storage.ReadS16(actArea);
SetCurrentAct((Act) actArea); SetCurrentAct((Act) actArea);
@ -513,7 +513,7 @@ MxS32 LegoGameState::ReadVariable(LegoStorage* p_storage, MxVariableTable* p_to)
MxS32 result = 1; MxS32 result = 1;
MxU8 len; MxU8 len;
if (p_storage->Read(&len, sizeof(len)) != SUCCESS) { if (p_storage->Read(&len, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
@ -531,7 +531,7 @@ MxS32 LegoGameState::ReadVariable(LegoStorage* p_storage, MxVariableTable* p_to)
goto done; goto done;
} }
if (p_storage->Read(&len, sizeof(len)) != SUCCESS) { if (p_storage->Read(&len, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
@ -615,8 +615,8 @@ MxResult LegoGameState::AddPlayer(Username& p_player)
m_playerCount++; m_playerCount++;
m_players[0].Set(p_player); m_players[0].Set(p_player);
m_unk0x24 = m_history.m_unk0x372; m_currentPlayerId = m_history.m_nextPlayerId;
m_history.m_unk0x372 = m_unk0x24 + 1; m_history.m_nextPlayerId = m_currentPlayerId + 1;
m_history.WriteScoreHistory(); m_history.WriteScoreHistory();
SetCurrentAct(e_act1); SetCurrentAct(e_act1);
@ -868,17 +868,17 @@ void LegoGameState::SwitchArea(Area p_area)
VideoManager()->SetUnk0x554(TRUE); VideoManager()->SetUnk0x554(TRUE);
InvokeAction(Extra::ActionType::e_opendisk, *g_infodoorScript, InfodoorScript::c__StartUp, NULL); InvokeAction(Extra::ActionType::e_opendisk, *g_infodoorScript, InfodoorScript::c__StartUp, NULL);
break; break;
case e_unk4: case e_infocenterExited:
case e_jetrace2: case e_jetrace2:
case e_jetraceExterior: case e_jetraceExterior:
case e_unk17: case e_jetskibuildExited:
case e_carraceExterior: case e_carraceExterior:
case e_unk20: case e_racecarbuildExited:
case e_unk21: case e_unk21:
case e_pizzeriaExterior: case e_pizzeriaExterior:
case e_garageExterior: case e_garageExterior:
case e_hospitalExterior: case e_hospitalExterior:
case e_unk31: case e_hospitalExited:
case e_policeExterior: case e_policeExterior:
case e_bike: case e_bike:
case e_dunecar: case e_dunecar:
@ -886,7 +886,7 @@ void LegoGameState::SwitchArea(Area p_area)
case e_copter: case e_copter:
case e_skateboard: case e_skateboard:
case e_jetski: case e_jetski:
case e_unk66: case e_vehicleExited:
LoadIsle(); LoadIsle();
break; break;
case e_elevbott: case e_elevbott:
@ -948,7 +948,7 @@ void LegoGameState::SwitchArea(Area p_area)
VideoManager()->Get3DManager()->SetFrustrum(90, 0.1f, 250.0f); VideoManager()->Get3DManager()->SetFrustrum(90, 0.1f, 250.0f);
InvokeAction(Extra::ActionType::e_start, *g_isleScript, IsleScript::c_GaraDoor, NULL); InvokeAction(Extra::ActionType::e_start, *g_isleScript, IsleScript::c_GaraDoor, NULL);
break; break;
case e_unk28: { case e_garageExited: {
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* state = (Act1State*) GameState()->GetState("Act1State");
LoadIsle(); LoadIsle();
@ -973,7 +973,7 @@ void LegoGameState::SwitchArea(Area p_area)
VideoManager()->SetUnk0x554(TRUE); VideoManager()->SetUnk0x554(TRUE);
InvokeAction(Extra::ActionType::e_opendisk, *g_hospitalScript, HospitalScript::c__StartUp, NULL); InvokeAction(Extra::ActionType::e_opendisk, *g_hospitalScript, HospitalScript::c__StartUp, NULL);
break; break;
case e_unk33: case e_policeExited:
LoadIsle(); LoadIsle();
SetCameraControllerFromIsle(); SetCameraControllerFromIsle();
UserActor()->ResetWorldTransform(TRUE); UserActor()->ResetWorldTransform(TRUE);
@ -1060,13 +1060,13 @@ void LegoGameState::SetColors()
} }
// FUNCTION: LEGO1 0x1003bac0 // FUNCTION: LEGO1 0x1003bac0
void LegoGameState::SetROIHandlerFunction() void LegoGameState::SetROIColorOverride()
{ {
LegoROI::FUN_100a9d30(&ROIHandlerFunction); LegoROI::SetColorOverride(&ROIColorOverride);
} }
// FUNCTION: LEGO1 0x1003bad0 // FUNCTION: LEGO1 0x1003bad0
MxBool ROIHandlerFunction(const char* p_input, char* p_output, MxU32 p_copyLen) MxBool ROIColorOverride(const char* p_input, char* p_output, MxU32 p_copyLen)
{ {
if (p_output != NULL && p_copyLen != 0 && if (p_output != NULL && p_copyLen != 0 &&
(strnicmp(p_input, "INDIR-F-", strlen("INDIR-F-")) == 0 || (strnicmp(p_input, "INDIR-F-", strlen("INDIR-F-")) == 0 ||
@ -1303,7 +1303,7 @@ void LegoBackgroundColor::ToggleSkyColor()
// FUNCTION: BETA10 0x10086984 // FUNCTION: BETA10 0x10086984
void LegoBackgroundColor::SetLightColor(float p_r, float p_g, float p_b) void LegoBackgroundColor::SetLightColor(float p_r, float p_g, float p_b)
{ {
if (!VideoManager()->GetVideoParam().Flags().GetF2bit0()) { if (!VideoManager()->GetVideoParam().Flags().GetLacksLightSupport()) {
// TODO: Computed constants based on what? // TODO: Computed constants based on what?
p_r *= 1. / 0.23; p_r *= 1. / 0.23;
p_g *= 1. / 0.63; p_g *= 1. / 0.63;
@ -1407,7 +1407,7 @@ MxResult LegoGameState::ScoreItem::Serialize(LegoStorage* p_storage)
} }
m_name.Serialize(p_storage); m_name.Serialize(p_storage);
p_storage->ReadS16(m_unk0x2a); p_storage->ReadS16(m_playerId);
} }
else if (p_storage->IsWriteMode()) { else if (p_storage->IsWriteMode()) {
p_storage->WriteS16(m_totalScore); p_storage->WriteS16(m_totalScore);
@ -1419,7 +1419,7 @@ MxResult LegoGameState::ScoreItem::Serialize(LegoStorage* p_storage)
} }
m_name.Serialize(p_storage); m_name.Serialize(p_storage);
p_storage->WriteS16(m_unk0x2a); p_storage->WriteS16(m_playerId);
} }
return SUCCESS; return SUCCESS;
@ -1430,7 +1430,7 @@ MxResult LegoGameState::ScoreItem::Serialize(LegoStorage* p_storage)
LegoGameState::History::History() LegoGameState::History::History()
{ {
m_count = 0; m_count = 0;
m_unk0x372 = 0; m_nextPlayerId = 0;
} }
// FUNCTION: LEGO1 0x1003c870 // FUNCTION: LEGO1 0x1003c870
@ -1441,83 +1441,128 @@ void LegoGameState::History::WriteScoreHistory()
MxU8 scores[5][5]; MxU8 scores[5][5];
InfocenterState* state = (InfocenterState*) GameState()->GetState("InfocenterState"); InfocenterState* state = (InfocenterState*) GameState()->GetState("InfocenterState");
if (state->m_letters[0]) {
JetskiRaceState* jetskiRaceState = (JetskiRaceState*) GameState()->GetState("JetskiRaceState");
CarRaceState* carRaceState = (CarRaceState*) GameState()->GetState("CarRaceState");
TowTrackMissionState* towTrackMissionState =
(TowTrackMissionState*) GameState()->GetState("TowTrackMissionState");
PizzaMissionState* pizzaMissionState = (PizzaMissionState*) GameState()->GetState("PizzaMissionState");
AmbulanceMissionState* ambulanceMissionState =
(AmbulanceMissionState*) GameState()->GetState("AmbulanceMissionState");
for (MxS32 actor = 1; actor <= 5; actor++) { if (!state->m_letters[0]) {
scores[0][actor - 1] = carRaceState ? carRaceState->GetState(actor)->GetHighScore() : 0; return;
totalScore += scores[0][actor - 1]; }
scores[1][actor - 1] = jetskiRaceState ? jetskiRaceState->GetState(actor)->GetHighScore() : 0; JetskiRaceState* jetskiRaceState = (JetskiRaceState*) GameState()->GetState("JetskiRaceState");
totalScore += scores[1][actor - 1]; CarRaceState* carRaceState = (CarRaceState*) GameState()->GetState("CarRaceState");
TowTrackMissionState* towTrackMissionState = (TowTrackMissionState*) GameState()->GetState("TowTrackMissionState");
PizzaMissionState* pizzaMissionState = (PizzaMissionState*) GameState()->GetState("PizzaMissionState");
AmbulanceMissionState* ambulanceMissionState =
(AmbulanceMissionState*) GameState()->GetState("AmbulanceMissionState");
scores[2][actor - 1] = pizzaMissionState ? pizzaMissionState->GetHighScore(actor) : 0; for (MxS32 actor = 1; actor <= 5; actor++) {
totalScore += scores[2][actor - 1]; scores[0][actor - 1] = carRaceState ? carRaceState->GetState(actor)->GetHighScore() : 0;
totalScore += scores[0][actor - 1];
scores[3][actor - 1] = towTrackMissionState ? towTrackMissionState->GetHighScore(actor) : 0; #ifdef BETA10
totalScore += scores[3][actor - 1]; // likely a bug in BETA10
scores[1][actor - 1] = carRaceState ? carRaceState->GetState(actor)->GetHighScore() : 0;
#else
scores[1][actor - 1] = jetskiRaceState ? jetskiRaceState->GetState(actor)->GetHighScore() : 0;
#endif
totalScore += scores[1][actor - 1];
scores[4][actor - 1] = ambulanceMissionState ? ambulanceMissionState->GetHighScore(actor) : 0; scores[2][actor - 1] = pizzaMissionState ? pizzaMissionState->GetHighScore(actor) : 0;
totalScore += scores[4][actor - 1]; totalScore += scores[2][actor - 1];
}
MxS32 unk0x2c; scores[3][actor - 1] = towTrackMissionState ? towTrackMissionState->GetHighScore(actor) : 0;
ScoreItem* p_scorehist = FUN_1003cc90(&GameState()->m_players[0], GameState()->m_unk0x24, unk0x2c); totalScore += scores[3][actor - 1];
if (p_scorehist != NULL) { scores[4][actor - 1] = ambulanceMissionState ? ambulanceMissionState->GetHighScore(actor) : 0;
p_scorehist->m_totalScore = totalScore; totalScore += scores[4][actor - 1];
memcpy(p_scorehist->m_scores, scores, sizeof(p_scorehist->m_scores)); }
}
else { MxS32 playerScoreHistoryIndex;
if (m_count < (MxS16) sizeOfArray(m_scores)) { ScoreItem* p_scorehist =
m_scores[m_count].m_totalScore = totalScore; FindPlayerInScoreHistory(GameState()->m_players, GameState()->m_currentPlayerId, playerScoreHistoryIndex);
memcpy(m_scores[m_count].m_scores, scores, sizeof(m_scores[m_count].m_scores));
m_scores[m_count].m_name = GameState()->m_players[0]; #ifdef BETA10
m_scores[m_count].m_unk0x2a = GameState()->m_unk0x24; if (!p_scorehist) {
m_count++; MxS32 playerScoreRank;
} // LINE: BETA10 0x100870ee
else if (m_scores[19].m_totalScore <= totalScore) { for (playerScoreRank = 0; playerScoreRank < m_count; playerScoreRank++) {
m_scores[19].m_totalScore = totalScore; if (totalScore > m_scores[m_indices[playerScoreRank]].m_totalScore) {
memcpy(m_scores[19].m_scores, scores, sizeof(m_scores[19].m_scores)); break;
m_scores[19].m_name = GameState()->m_players[0];
m_scores[19].m_unk0x2a = GameState()->m_unk0x24;
} }
} }
// LINE: BETA10 0x1008713f
if (playerScoreRank < m_count) {
if (m_count < 20) {
playerScoreHistoryIndex = m_count++;
}
else {
playerScoreHistoryIndex = m_indices[19];
}
MxU8 tmpScores[5][5]; MxS32 max = m_count - 1;
Username tmpPlayer; for (MxS32 j = max; playerScoreRank < j; j--) {
MxS16 tmpUnk0x2a; m_indices[j - 1] = m_indices[j - 2];
}
// TODO: Match bubble sort loops m_indices[playerScoreRank] = playerScoreHistoryIndex;
for (MxS32 i = m_count - 1; i > 0; i--) { p_scorehist = &m_scores[playerScoreHistoryIndex];
for (MxS32 j = 1; j <= i; j++) { }
if (m_scores[j - 1].m_totalScore < m_scores[j].m_totalScore) { else if (playerScoreRank < 20) {
memcpy(tmpScores, m_scores[j - 1].m_scores, sizeof(tmpScores)); m_indices[m_count] = m_count;
tmpPlayer = m_scores[j - 1].m_name; p_scorehist = &m_scores[m_count++];
tmpUnk0x2a = m_scores[j - 1].m_unk0x2a; }
}
else if (p_scorehist->m_totalScore != totalScore) {
assert(totalScore > p_scorehist->m_totalScore);
memcpy(m_scores[j - 1].m_scores, m_scores[j].m_scores, sizeof(m_scores[j - 1].m_scores)); for (MxS32 i = playerScoreHistoryIndex; i > 0 && m_indices[i - 1] < m_indices[i]; i--) {
m_scores[j - 1].m_name = m_scores[j].m_name; MxU8 tmp = m_indices[i - 1];
m_scores[j - 1].m_unk0x2a = m_scores[j].m_unk0x2a; m_indices[i - 1] = m_indices[i];
m_indices[i] = tmp;
}
}
if (p_scorehist) {
p_scorehist->m_totalScore = totalScore;
memcpy(p_scorehist->m_scores[0], scores[0], sizeof(scores));
p_scorehist->m_name = GameState()->m_players[0];
p_scorehist->m_playerId = GameState()->m_currentPlayerId;
}
#else
if (p_scorehist != NULL) {
p_scorehist->m_totalScore = totalScore;
memcpy(p_scorehist->m_scores, scores, sizeof(p_scorehist->m_scores));
}
else {
if (m_count < (MxS16) sizeOfArray(m_scores)) {
m_scores[m_count].m_totalScore = totalScore;
memcpy(m_scores[m_count].m_scores, scores, sizeof(m_scores[m_count].m_scores));
m_scores[m_count].m_name = GameState()->m_players[0];
m_scores[m_count].m_playerId = GameState()->m_currentPlayerId;
m_count++;
}
else if (m_scores[19].m_totalScore <= totalScore) {
m_scores[19].m_totalScore = totalScore;
memcpy(m_scores[19].m_scores, scores, sizeof(m_scores[19].m_scores));
m_scores[19].m_name = GameState()->m_players[0];
m_scores[19].m_playerId = GameState()->m_currentPlayerId;
}
}
memcpy(m_scores[j].m_scores, tmpScores, sizeof(m_scores[j].m_scores)); ScoreItem tmpItem;
m_scores[j].m_name = tmpPlayer;
m_scores[j].m_unk0x2a = tmpUnk0x2a; for (MxS32 i = m_count - 1; i >= 0; i--) {
} for (MxS32 j = 1; j <= i; j++) {
if (m_scores[j].m_totalScore > m_scores[j - 1].m_totalScore) {
tmpItem = m_scores[j - 1];
m_scores[j - 1] = m_scores[j];
m_scores[j] = tmpItem;
} }
} }
} }
#endif
} }
// FUNCTION: LEGO1 0x1003cc90 // FUNCTION: LEGO1 0x1003cc90
// FUNCTION: BETA10 0x1008732a // FUNCTION: BETA10 0x1008732a
LegoGameState::ScoreItem* LegoGameState::History::FUN_1003cc90( LegoGameState::ScoreItem* LegoGameState::History::FindPlayerInScoreHistory(
LegoGameState::Username* p_player, LegoGameState::Username* p_player,
MxS16 p_unk0x24, MxS16 p_unk0x24,
MxS32& p_unk0x2c MxS32& p_unk0x2c
@ -1525,7 +1570,7 @@ LegoGameState::ScoreItem* LegoGameState::History::FUN_1003cc90(
{ {
MxS32 i = 0; MxS32 i = 0;
for (; i < m_count; i++) { for (; i < m_count; i++) {
if (!memcmp(p_player, &m_scores[i].m_name, sizeof(*p_player)) && m_scores[i].m_unk0x2a == p_unk0x24) { if (!memcmp(p_player, &m_scores[i].m_name, sizeof(*p_player)) && m_scores[i].m_playerId == p_unk0x24) {
break; break;
} }
} }
@ -1544,7 +1589,7 @@ LegoGameState::ScoreItem* LegoGameState::History::FUN_1003cc90(
MxResult LegoGameState::History::Serialize(LegoStorage* p_storage) MxResult LegoGameState::History::Serialize(LegoStorage* p_storage)
{ {
if (p_storage->IsReadMode()) { if (p_storage->IsReadMode()) {
p_storage->ReadS16(m_unk0x372); p_storage->ReadS16(m_nextPlayerId);
p_storage->ReadS16(m_count); p_storage->ReadS16(m_count);
for (MxS16 i = 0; i < m_count; i++) { for (MxS16 i = 0; i < m_count; i++) {
@ -1554,7 +1599,7 @@ MxResult LegoGameState::History::Serialize(LegoStorage* p_storage)
} }
} }
else if (p_storage->IsWriteMode()) { else if (p_storage->IsWriteMode()) {
p_storage->WriteS16(m_unk0x372); p_storage->WriteS16(m_nextPlayerId);
p_storage->WriteS16(m_count); p_storage->WriteS16(m_count);
for (MxS16 i = 0; i < m_count; i++) { for (MxS16 i = 0; i < m_count; i++) {
@ -1584,6 +1629,7 @@ void LegoGameState::SerializeScoreHistory(MxS16 p_flags)
} }
// FUNCTION: LEGO1 0x1003cea0 // FUNCTION: LEGO1 0x1003cea0
// FUNCTION: BETA10 0x10017840
void LegoGameState::SetCurrentAct(Act p_currentAct) void LegoGameState::SetCurrentAct(Act p_currentAct)
{ {
m_currentAct = p_currentAct; m_currentAct = p_currentAct;

View File

@ -8,39 +8,39 @@ LegoPhoneme::~LegoPhoneme()
} }
// FUNCTION: LEGO1 0x10044eb0 // FUNCTION: LEGO1 0x10044eb0
undefined4 LegoPhoneme::VTable0x00() MxU32 LegoPhoneme::GetCount()
{ {
return m_unk0x14; return m_count;
} }
// FUNCTION: LEGO1 0x10044ec0 // FUNCTION: LEGO1 0x10044ec0
void LegoPhoneme::VTable0x04(undefined4 p_unk0x14) void LegoPhoneme::SetCount(MxU32 p_count)
{ {
m_unk0x14 = p_unk0x14; m_count = p_count;
} }
// FUNCTION: LEGO1 0x10044ed0 // FUNCTION: LEGO1 0x10044ed0
LegoTextureInfo* LegoPhoneme::VTable0x08() LegoTextureInfo* LegoPhoneme::GetTextureInfo()
{ {
return m_unk0x18; return m_textureInfo;
} }
// FUNCTION: LEGO1 0x10044ee0 // FUNCTION: LEGO1 0x10044ee0
void LegoPhoneme::VTable0x0c(LegoTextureInfo* p_unk0x18) void LegoPhoneme::SetTextureInfo(LegoTextureInfo* p_textureInfo)
{ {
m_unk0x18 = p_unk0x18; m_textureInfo = p_textureInfo;
} }
// FUNCTION: LEGO1 0x10044ef0 // FUNCTION: LEGO1 0x10044ef0
LegoTextureInfo* LegoPhoneme::VTable0x10() LegoTextureInfo* LegoPhoneme::GetCachedTextureInfo()
{ {
return m_unk0x1c; return m_cachedTextureInfo;
} }
// FUNCTION: LEGO1 0x10044f00 // FUNCTION: LEGO1 0x10044f00
void LegoPhoneme::VTable0x14(LegoTextureInfo* p_unk0x1c) void LegoPhoneme::SetCachedTextureInfo(LegoTextureInfo* p_cachedTextureInfo)
{ {
m_unk0x1c = p_unk0x1c; m_cachedTextureInfo = p_cachedTextureInfo;
} }
// FUNCTION: LEGO1 0x10044f10 // FUNCTION: LEGO1 0x10044f10
@ -51,9 +51,9 @@ void LegoPhoneme::VTable0x18()
// FUNCTION: LEGO1 0x10044f20 // FUNCTION: LEGO1 0x10044f20
void LegoPhoneme::Init() void LegoPhoneme::Init()
{ {
m_unk0x14 = 0; m_count = 0;
m_unk0x18 = NULL; m_textureInfo = NULL;
m_unk0x1c = NULL; m_cachedTextureInfo = NULL;
} }
// FUNCTION: LEGO1 0x10044f30 // FUNCTION: LEGO1 0x10044f30

View File

@ -31,19 +31,19 @@ const char* g_plantLodNames[4][5] = {
}; };
// GLOBAL: LEGO1 0x100f16b0 // GLOBAL: LEGO1 0x100f16b0
float g_unk0x100f16b0[] = {0.1f, 0.7f, 0.5f, 0.9f}; float g_heightPerCount[] = {0.1f, 0.7f, 0.5f, 0.9f};
// GLOBAL: LEGO1 0x100f16c0 // GLOBAL: LEGO1 0x100f16c0
MxU8 g_unk0x100f16c0[] = {1, 2, 2, 3}; MxU8 g_counters[] = {1, 2, 2, 3};
// GLOBAL: LEGO1 0x100f315c // GLOBAL: LEGO1 0x100f315c
MxU32 LegoPlantManager::g_maxSound = 8; MxU32 LegoPlantManager::g_maxSound = 8;
// GLOBAL: LEGO1 0x100f3160 // GLOBAL: LEGO1 0x100f3160
MxU32 g_unk0x100f3160 = 56; MxU32 g_plantSoundIdOffset = 56;
// GLOBAL: LEGO1 0x100f3164 // GLOBAL: LEGO1 0x100f3164
MxU32 g_unk0x100f3164 = 66; MxU32 g_plantSoundIdMoodOffset = 66;
// GLOBAL: LEGO1 0x100f3168 // GLOBAL: LEGO1 0x100f3168
MxS32 LegoPlantManager::g_maxMove[4] = {3, 3, 3, 3}; MxS32 LegoPlantManager::g_maxMove[4] = {3, 3, 3, 3};
@ -83,7 +83,7 @@ void LegoPlantManager::Init()
} }
m_worldId = LegoOmni::e_undefined; m_worldId = LegoOmni::e_undefined;
m_unk0x0c = 0; m_boundariesDetermined = FALSE;
m_numEntries = 0; m_numEntries = 0;
} }
@ -98,7 +98,7 @@ void LegoPlantManager::LoadWorldInfo(LegoOmni::World p_worldId)
CreatePlant(i, world, p_worldId); CreatePlant(i, world, p_worldId);
} }
m_unk0x0c = 0; m_boundariesDetermined = FALSE;
} }
// FUNCTION: LEGO1 0x100263a0 // FUNCTION: LEGO1 0x100263a0
@ -119,12 +119,12 @@ void LegoPlantManager::Reset(LegoOmni::World p_worldId)
} }
m_worldId = LegoOmni::e_undefined; m_worldId = LegoOmni::e_undefined;
m_unk0x0c = 0; m_boundariesDetermined = FALSE;
} }
// FUNCTION: LEGO1 0x10026410 // FUNCTION: LEGO1 0x10026410
// FUNCTION: BETA10 0x100c50e9 // FUNCTION: BETA10 0x100c50e9
MxResult LegoPlantManager::FUN_10026410() MxResult LegoPlantManager::DetermineBoundaries()
{ {
// similar to LegoBuildingManager::FUN_10030630() // similar to LegoBuildingManager::FUN_10030630()
@ -160,7 +160,7 @@ MxResult LegoPlantManager::FUN_10026410()
} }
if (g_plantInfo[i].m_boundary != NULL) { if (g_plantInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_plantInfo[i].m_boundary->GetUnknown0x14(); Mx4DPointFloat& unk0x14 = *g_plantInfo[i].m_boundary->GetUp();
if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 || if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 ||
position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) { position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) {
@ -192,7 +192,7 @@ MxResult LegoPlantManager::FUN_10026410()
} }
} }
m_unk0x0c = TRUE; m_boundariesDetermined = TRUE;
return SUCCESS; return SUCCESS;
} }
@ -200,8 +200,8 @@ MxResult LegoPlantManager::FUN_10026410()
// FUNCTION: BETA10 0x100c55e0 // FUNCTION: BETA10 0x100c55e0
LegoPlantInfo* LegoPlantManager::GetInfoArray(MxS32& p_length) LegoPlantInfo* LegoPlantManager::GetInfoArray(MxS32& p_length)
{ {
if (!m_unk0x0c) { if (!m_boundariesDetermined) {
FUN_10026410(); DetermineBoundaries();
} }
p_length = sizeOfArray(g_plantInfo); p_length = sizeOfArray(g_plantInfo);
@ -217,7 +217,7 @@ LegoEntity* LegoPlantManager::CreatePlant(MxS32 p_index, LegoWorld* p_world, Leg
if (p_index < sizeOfArray(g_plantInfo)) { if (p_index < sizeOfArray(g_plantInfo)) {
MxU32 world = 1 << (MxU8) p_worldId; MxU32 world = 1 << (MxU8) p_worldId;
if (g_plantInfo[p_index].m_worlds & world && g_plantInfo[p_index].m_unk0x16 != 0) { if (g_plantInfo[p_index].m_worlds & world && g_plantInfo[p_index].m_counter != 0) {
if (g_plantInfo[p_index].m_entity == NULL) { if (g_plantInfo[p_index].m_entity == NULL) {
char name[256]; char name[256];
char lodName[256]; char lodName[256];
@ -285,7 +285,7 @@ MxResult LegoPlantManager::Write(LegoStorage* p_storage)
if (p_storage->Write(&info->m_color, sizeof(info->m_color)) != SUCCESS) { if (p_storage->Write(&info->m_color, sizeof(info->m_color)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Write(&info->m_initialUnk0x16, sizeof(info->m_initialUnk0x16)) != SUCCESS) { if (p_storage->Write(&info->m_initialCounter, sizeof(info->m_initialCounter)) != SUCCESS) {
goto done; goto done;
} }
} }
@ -305,27 +305,27 @@ MxResult LegoPlantManager::Read(LegoStorage* p_storage)
for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
LegoPlantInfo* info = &g_plantInfo[i]; LegoPlantInfo* info = &g_plantInfo[i];
if (p_storage->Read(&info->m_variant, sizeof(info->m_variant)) != SUCCESS) { if (p_storage->Read(&info->m_variant, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_sound, sizeof(info->m_sound)) != SUCCESS) { if (p_storage->Read(&info->m_sound, sizeof(MxU32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_move, sizeof(info->m_move)) != SUCCESS) { if (p_storage->Read(&info->m_move, sizeof(MxU32)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { if (p_storage->Read(&info->m_mood, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_color, sizeof(info->m_color)) != SUCCESS) { if (p_storage->Read(&info->m_color, sizeof(MxU8)) != SUCCESS) {
goto done; goto done;
} }
if (p_storage->Read(&info->m_unk0x16, sizeof(info->m_unk0x16)) != SUCCESS) { if (p_storage->Read(&info->m_counter, sizeof(MxS8)) != SUCCESS) {
goto done; goto done;
} }
info->m_initialUnk0x16 = info->m_unk0x16; info->m_initialCounter = info->m_counter;
FUN_10026860(i); AdjustHeight(i);
} }
result = SUCCESS; result = SUCCESS;
@ -336,13 +336,13 @@ MxResult LegoPlantManager::Read(LegoStorage* p_storage)
// FUNCTION: LEGO1 0x10026860 // FUNCTION: LEGO1 0x10026860
// FUNCTION: BETA10 0x100c5be0 // FUNCTION: BETA10 0x100c5be0
void LegoPlantManager::FUN_10026860(MxS32 p_index) void LegoPlantManager::AdjustHeight(MxS32 p_index)
{ {
MxU8 variant = g_plantInfo[p_index].m_variant; MxU8 variant = g_plantInfo[p_index].m_variant;
if (g_plantInfo[p_index].m_unk0x16 >= 0) { if (g_plantInfo[p_index].m_counter >= 0) {
float value = g_unk0x100f16c0[variant] - g_plantInfo[p_index].m_unk0x16; float value = g_counters[variant] - g_plantInfo[p_index].m_counter;
g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1] - value * g_unk0x100f16b0[variant]; g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1] - value * g_heightPerCount[variant];
} }
else { else {
g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1]; g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1];
@ -394,13 +394,13 @@ MxBool LegoPlantManager::SwitchColor(LegoEntity* p_entity)
ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]); ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]);
if (roi->GetUnknown0xe0() >= 0) { if (roi->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi);
} }
roi->SetLODList(lodList); roi->SetLODList(lodList);
lodList->Release(); lodList->Release();
CharacterManager()->FUN_10085870(roi); CharacterManager()->UpdateBoundingSphereAndBox(roi);
return TRUE; return TRUE;
} }
@ -410,7 +410,7 @@ MxBool LegoPlantManager::SwitchVariant(LegoEntity* p_entity)
{ {
LegoPlantInfo* info = GetInfo(p_entity); LegoPlantInfo* info = GetInfo(p_entity);
if (info == NULL || info->m_unk0x16 != -1) { if (info == NULL || info->m_counter != -1) {
return FALSE; return FALSE;
} }
@ -423,13 +423,13 @@ MxBool LegoPlantManager::SwitchVariant(LegoEntity* p_entity)
ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]); ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]);
if (roi->GetUnknown0xe0() >= 0) { if (roi->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi);
} }
roi->SetLODList(lodList); roi->SetLODList(lodList);
lodList->Release(); lodList->Release();
CharacterManager()->FUN_10085870(roi); CharacterManager()->UpdateBoundingSphereAndBox(roi);
if (info->m_move != 0 && info->m_move >= g_maxMove[info->m_variant]) { if (info->m_move != 0 && info->m_move >= g_maxMove[info->m_variant]) {
info->m_move = g_maxMove[info->m_variant] - 1; info->m_move = g_maxMove[info->m_variant] - 1;
@ -513,16 +513,16 @@ MxU32 LegoPlantManager::GetAnimationId(LegoEntity* p_entity)
// FUNCTION: LEGO1 0x10026ba0 // FUNCTION: LEGO1 0x10026ba0
// FUNCTION: BETA10 0x100c61ba // FUNCTION: BETA10 0x100c61ba
MxU32 LegoPlantManager::GetSoundId(LegoEntity* p_entity, MxBool p_state) MxU32 LegoPlantManager::GetSoundId(LegoEntity* p_entity, MxBool p_basedOnMood)
{ {
LegoPlantInfo* info = GetInfo(p_entity); LegoPlantInfo* info = GetInfo(p_entity);
if (p_state) { if (p_basedOnMood) {
return (info->m_mood & 1) + g_unk0x100f3164; return (info->m_mood & 1) + g_plantSoundIdMoodOffset;
} }
if (info != NULL) { if (info != NULL) {
return info->m_sound + g_unk0x100f3160; return info->m_sound + g_plantSoundIdOffset;
} }
return 0; return 0;
@ -550,7 +550,7 @@ void LegoPlantManager::SetCustomizeAnimFile(const char* p_value)
// FUNCTION: LEGO1 0x10026c50 // FUNCTION: LEGO1 0x10026c50
// FUNCTION: BETA10 0x100c6349 // FUNCTION: BETA10 0x100c6349
MxBool LegoPlantManager::FUN_10026c50(LegoEntity* p_entity) MxBool LegoPlantManager::DecrementCounter(LegoEntity* p_entity)
{ {
LegoPlantInfo* info = GetInfo(p_entity); LegoPlantInfo* info = GetInfo(p_entity);
@ -558,12 +558,12 @@ MxBool LegoPlantManager::FUN_10026c50(LegoEntity* p_entity)
return FALSE; return FALSE;
} }
return FUN_10026c80(info - g_plantInfo); return DecrementCounter(info - g_plantInfo);
} }
// FUNCTION: LEGO1 0x10026c80 // FUNCTION: LEGO1 0x10026c80
// FUNCTION: BETA10 0x100c63eb // FUNCTION: BETA10 0x100c63eb
MxBool LegoPlantManager::FUN_10026c80(MxS32 p_index) MxBool LegoPlantManager::DecrementCounter(MxS32 p_index)
{ {
if (p_index >= sizeOfArray(g_plantInfo)) { if (p_index >= sizeOfArray(g_plantInfo)) {
return FALSE; return FALSE;
@ -577,23 +577,23 @@ MxBool LegoPlantManager::FUN_10026c80(MxS32 p_index)
MxBool result = TRUE; MxBool result = TRUE;
if (info->m_unk0x16 < 0) { if (info->m_counter < 0) {
info->m_unk0x16 = g_unk0x100f16c0[info->m_variant]; info->m_counter = g_counters[info->m_variant];
} }
if (info->m_unk0x16 > 0) { if (info->m_counter > 0) {
LegoROI* roi = info->m_entity->GetROI(); LegoROI* roi = info->m_entity->GetROI();
info->m_unk0x16--; info->m_counter--;
if (info->m_unk0x16 == 1) { if (info->m_counter == 1) {
info->m_unk0x16 = 0; info->m_counter = 0;
} }
if (info->m_unk0x16 == 0) { if (info->m_counter == 0) {
roi->SetVisibility(FALSE); roi->SetVisibility(FALSE);
} }
else { else {
FUN_10026860(info - g_plantInfo); AdjustHeight(info - g_plantInfo);
info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE); info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE);
} }
} }
@ -623,7 +623,7 @@ void LegoPlantManager::ScheduleAnimation(LegoEntity* p_entity, MxLong p_length)
time += p_length; time += p_length;
entry->m_time = time + 1000; entry->m_time = time + 1000;
FUN_100271b0(p_entity, -1); AdjustCounter(p_entity, -1);
} }
// FUNCTION: LEGO1 0x10026e00 // FUNCTION: LEGO1 0x10026e00
@ -666,17 +666,17 @@ MxResult LegoPlantManager::Tickle()
SET3(locald8[3], localec); SET3(locald8[3], localec);
entry->m_roi->FUN_100a58f0(locald8); entry->m_roi->SetLocal2World(locald8);
entry->m_roi->VTable0x14(); entry->m_roi->WrappedUpdateWorldData();
if (entry->m_time < time) { if (entry->m_time < time) {
LegoPlantInfo* info = GetInfo(entry->m_entity); LegoPlantInfo* info = GetInfo(entry->m_entity);
if (info->m_unk0x16 == 0) { if (info->m_counter == 0) {
entry->m_roi->SetVisibility(FALSE); entry->m_roi->SetVisibility(FALSE);
} }
else { else {
FUN_10026860(info - g_plantInfo); AdjustHeight(info - g_plantInfo);
info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE); info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE);
} }
@ -699,14 +699,14 @@ MxResult LegoPlantManager::Tickle()
} }
// FUNCTION: LEGO1 0x10027120 // FUNCTION: LEGO1 0x10027120
void LegoPlantManager::FUN_10027120() void LegoPlantManager::ClearCounters()
{ {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) { for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
g_plantInfo[i].m_unk0x16 = -1; g_plantInfo[i].m_counter = -1;
g_plantInfo[i].m_initialUnk0x16 = -1; g_plantInfo[i].m_initialCounter = -1;
FUN_10026860(i); AdjustHeight(i);
if (g_plantInfo[i].m_entity != NULL) { if (g_plantInfo[i].m_entity != NULL) {
g_plantInfo[i].m_entity->SetLocation( g_plantInfo[i].m_entity->SetLocation(
@ -720,28 +720,28 @@ void LegoPlantManager::FUN_10027120()
} }
// FUNCTION: LEGO1 0x100271b0 // FUNCTION: LEGO1 0x100271b0
void LegoPlantManager::FUN_100271b0(LegoEntity* p_entity, MxS32 p_adjust) void LegoPlantManager::AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust)
{ {
LegoPlantInfo* info = GetInfo(p_entity); LegoPlantInfo* info = GetInfo(p_entity);
if (info != NULL) { if (info != NULL) {
if (info->m_unk0x16 < 0) { if (info->m_counter < 0) {
info->m_unk0x16 = g_unk0x100f16c0[info->m_variant]; info->m_counter = g_counters[info->m_variant];
} }
if (info->m_unk0x16 > 0) { if (info->m_counter > 0) {
info->m_unk0x16 += p_adjust; info->m_counter += p_adjust;
if (info->m_unk0x16 <= 1 && p_adjust < 0) { if (info->m_counter <= 1 && p_adjust < 0) {
info->m_unk0x16 = 0; info->m_counter = 0;
} }
} }
} }
} }
// FUNCTION: LEGO1 0x10027200 // FUNCTION: LEGO1 0x10027200
void LegoPlantManager::FUN_10027200() void LegoPlantManager::SetInitialCounters()
{ {
for (MxU32 i = 0; i < sizeOfArray(g_plantInfo); i++) { for (MxU32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
g_plantInfo[i].m_initialUnk0x16 = g_plantInfo[i].m_unk0x16; g_plantInfo[i].m_initialCounter = g_plantInfo[i].m_counter;
} }
} }

View File

@ -65,7 +65,7 @@ LegoTextureInfo* LegoTextureInfo::Create(const char* p_name, LegoTexture* p_text
desc.dwFlags = DDSD_PIXELFORMAT | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; desc.dwFlags = DDSD_PIXELFORMAT | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
desc.dwWidth = image->GetWidth(); desc.dwWidth = image->GetWidth();
desc.dwHeight = image->GetHeight(); desc.dwHeight = image->GetHeight();
desc.ddsCaps.dwCaps = DDCAPS_OVERLAYCANTCLIP | DDCAPS_OVERLAY; desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY;
desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat); desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
desc.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8; desc.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
desc.ddpfPixelFormat.dwRGBBitCount = 8; desc.ddpfPixelFormat.dwRGBBitCount = 8;
@ -112,7 +112,7 @@ LegoTextureInfo* LegoTextureInfo::Create(const char* p_name, LegoTexture* p_text
entries[i].peBlue = image->GetPaletteEntry(i).GetBlue(); entries[i].peBlue = image->GetPaletteEntry(i).GetBlue();
} }
else { else {
entries[i].peFlags = 0x80; entries[i].peFlags = D3DPAL_RESERVED;
} }
} }
@ -186,14 +186,14 @@ BOOL LegoTextureInfo::GetGroupTexture(Tgl::Mesh* pMesh, LegoTextureInfo*& p_text
} }
// FUNCTION: LEGO1 0x10066010 // FUNCTION: LEGO1 0x10066010
LegoResult LegoTextureInfo::FUN_10066010(const LegoU8* p_bits) LegoResult LegoTextureInfo::LoadBits(const LegoU8* p_bits)
{ {
if (m_surface != NULL && m_texture != NULL) { if (m_surface != NULL && m_texture != NULL) {
DDSURFACEDESC desc; DDSURFACEDESC desc;
memset(&desc, 0, sizeof(desc)); memset(&desc, 0, sizeof(desc));
desc.dwSize = sizeof(desc); desc.dwSize = sizeof(desc);
if (m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) { if (m_surface->Lock(NULL, &desc, DDLOCK_SURFACEMEMORYPTR, NULL) == DD_OK) {
MxU8* surface = (MxU8*) desc.lpSurface; MxU8* surface = (MxU8*) desc.lpSurface;
const LegoU8* bits = p_bits; const LegoU8* bits = p_bits;

View File

@ -86,7 +86,7 @@ void RotateY(LegoROI* p_roi, MxFloat p_angle)
mat[i][2] = (local2world[i][2] * fcos) - (local2world[i][0] * fsin); mat[i][2] = (local2world[i][2] * fcos) - (local2world[i][0] * fsin);
} }
p_roi->WrappedSetLocalTransform(mat); p_roi->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
} }
// FUNCTION: LEGO1 0x1003de80 // FUNCTION: LEGO1 0x1003de80
@ -99,29 +99,29 @@ MxBool SpheresIntersect(const BoundingSphere& p_sphere1, const BoundingSphere& p
// FUNCTION: LEGO1 0x1003ded0 // FUNCTION: LEGO1 0x1003ded0
// FUNCTION: BETA10 0x100d3802 // FUNCTION: BETA10 0x100d3802
MxBool FUN_1003ded0(MxFloat p_param1[2], MxFloat p_param2[3], MxFloat p_param3[3]) MxBool CalculateRayOriginDirection(MxFloat p_coordinates[2], MxFloat p_direction[3], MxFloat p_origin[3])
{ {
MxFloat local1c[4]; MxFloat screenPoint[4];
MxFloat local10[3]; MxFloat farPoint[3];
Tgl::View* view = VideoManager()->Get3DManager()->GetLego3DView()->GetView(); Tgl::View* view = VideoManager()->Get3DManager()->GetLego3DView()->GetView();
local1c[0] = p_param1[0]; screenPoint[0] = p_coordinates[0];
local1c[1] = p_param1[1]; screenPoint[1] = p_coordinates[1];
local1c[2] = 1.0f; screenPoint[2] = 1.0f;
local1c[3] = 1.0f; screenPoint[3] = 1.0f;
view->TransformScreenToWorld(local1c, p_param3); view->TransformScreenToWorld(screenPoint, p_origin);
local1c[0] *= 2.0; screenPoint[0] *= 2.0;
local1c[1] *= 2.0; screenPoint[1] *= 2.0;
local1c[3] = 2.0; screenPoint[3] = 2.0;
view->TransformScreenToWorld(local1c, local10); view->TransformScreenToWorld(screenPoint, farPoint);
p_param2[0] = local10[0] - p_param3[0]; p_direction[0] = farPoint[0] - p_origin[0];
p_param2[1] = local10[1] - p_param3[1]; p_direction[1] = farPoint[1] - p_origin[1];
p_param2[2] = local10[2] - p_param3[2]; p_direction[2] = farPoint[2] - p_origin[2];
return TRUE; return TRUE;
} }
@ -173,7 +173,7 @@ LegoTreeNode* GetTreeNode(LegoTreeNode* p_node, MxU32 p_index)
// FUNCTION: LEGO1 0x1003e050 // FUNCTION: LEGO1 0x1003e050
// FUNCTION: BETA10 0x100d3abc // FUNCTION: BETA10 0x100d3abc
void FUN_1003e050(LegoAnimPresenter* p_presenter) void CalculateViewFromAnimation(LegoAnimPresenter* p_presenter)
{ {
MxMatrix viewMatrix; MxMatrix viewMatrix;
LegoTreeNode* rootNode = p_presenter->GetAnimation()->GetRoot(); LegoTreeNode* rootNode = p_presenter->GetAnimation()->GetRoot();
@ -181,7 +181,7 @@ void FUN_1003e050(LegoAnimPresenter* p_presenter)
LegoAnimNodeData* targetData = NULL; LegoAnimNodeData* targetData = NULL;
MxS16 nodesCount = CountTotalTreeNodes(rootNode); MxS16 nodesCount = CountTotalTreeNodes(rootNode);
MxFloat cam; MxFloat fov;
for (MxS16 i = 0; i < nodesCount; i++) { for (MxS16 i = 0; i < nodesCount; i++) {
if (camData && targetData) { if (camData && targetData) {
break; break;
@ -191,7 +191,7 @@ void FUN_1003e050(LegoAnimPresenter* p_presenter)
if (!strnicmp(data->GetName(), "CAM", strlen("CAM"))) { if (!strnicmp(data->GetName(), "CAM", strlen("CAM"))) {
camData = data; camData = data;
cam = atof(&data->GetName()[strlen(data->GetName()) - 2]); fov = atof(&data->GetName()[strlen(data->GetName()) - 2]);
} }
else if (!strcmpi(data->GetName(), "TARGET")) { else if (!strcmpi(data->GetName(), "TARGET")) {
targetData = data; targetData = data;
@ -218,10 +218,10 @@ void FUN_1003e050(LegoAnimPresenter* p_presenter)
LegoROI* roi = video->GetViewROI(); LegoROI* roi = video->GetViewROI();
Lego3DView* view = video->Get3DManager()->GetLego3DView(); Lego3DView* view = video->Get3DManager()->GetLego3DView();
roi->WrappedSetLocalTransform(viewMatrix); roi->WrappedSetLocal2WorldWithWorldDataUpdate(viewMatrix);
view->Moved(*roi); view->Moved(*roi);
FUN_1003eda0(); ResetViewVelocity();
video->Get3DManager()->SetFrustrum(cam, 0.1, 250.0); video->Get3DManager()->SetFrustrum(fov, 0.1, 250.0);
} }
// FUNCTION: LEGO1 0x1003e300 // FUNCTION: LEGO1 0x1003e300
@ -473,14 +473,14 @@ void PlayCamAnim(LegoPathActor* p_actor, MxBool p_unused, MxU32 p_location, MxBo
// FUNCTION: LEGO1 0x1003eda0 // FUNCTION: LEGO1 0x1003eda0
// FUNCTION: BETA10 0x100d4bf4 // FUNCTION: BETA10 0x100d4bf4
void FUN_1003eda0() void ResetViewVelocity()
{ {
Mx3DPointFloat vec; Mx3DPointFloat vec;
vec.Clear(); vec.Clear();
LegoROI* viewROI = VideoManager()->GetViewROI(); LegoROI* viewROI = VideoManager()->GetViewROI();
if (viewROI) { if (viewROI) {
viewROI->FUN_100a5a30(vec); viewROI->SetWorldVelocity(vec);
SoundManager()->UpdateListener( SoundManager()->UpdateListener(
viewROI->GetWorldPosition(), viewROI->GetWorldPosition(),
viewROI->GetWorldDirection(), viewROI->GetWorldDirection(),
@ -507,7 +507,7 @@ MxBool RemoveFromCurrentWorld(const MxAtomId& p_atomId, MxS32 p_id)
} }
else { else {
if (((MxPresenter*) object)->GetAction()) { if (((MxPresenter*) object)->GetAction()) {
FUN_100b7220(((MxPresenter*) object)->GetAction(), MxDSAction::c_world, FALSE); ApplyMask(((MxPresenter*) object)->GetAction(), MxDSAction::c_world, FALSE);
} }
((MxPresenter*) object)->EndAction(); ((MxPresenter*) object)->EndAction();
@ -536,7 +536,7 @@ MxBool RemoveFromWorld(MxAtomId& p_entityAtom, MxS32 p_entityId, MxAtomId& p_wor
} }
else { else {
if (((MxPresenter*) object)->GetAction()) { if (((MxPresenter*) object)->GetAction()) {
FUN_100b7220(((MxPresenter*) object)->GetAction(), MxDSAction::c_world, FALSE); ApplyMask(((MxPresenter*) object)->GetAction(), MxDSAction::c_world, FALSE);
} }
((MxPresenter*) object)->EndAction(); ((MxPresenter*) object)->EndAction();
@ -565,11 +565,11 @@ void EnableAnimations(MxBool p_enable)
// FUNCTION: LEGO1 0x1003ef40 // FUNCTION: LEGO1 0x1003ef40
void SetAppCursor(Cursor p_cursor) void SetAppCursor(Cursor p_cursor)
{ {
PostMessageA(MxOmni::GetInstance()->GetWindowHandle(), WM_ISLE_SETCURSOR, p_cursor, 0); PostMessage(MxOmni::GetInstance()->GetWindowHandle(), WM_ISLE_SETCURSOR, p_cursor, 0);
} }
// FUNCTION: LEGO1 0x1003ef60 // FUNCTION: LEGO1 0x1003ef60
MxBool FUN_1003ef60() MxBool CanExit()
{ {
Act1State* act1State = (Act1State*) GameState()->GetState("Act1State"); Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
@ -705,14 +705,14 @@ void WriteDefaultTexture(LegoStorage* p_storage, const char* p_name)
if (image != NULL) { if (image != NULL) {
if (desc.dwWidth == desc.lPitch) { if (desc.dwWidth == desc.lPitch) {
memcpy(desc.lpSurface, image->GetBits(), desc.dwWidth * desc.dwHeight); memcpy(image->GetBits(), desc.lpSurface, desc.dwWidth * desc.dwHeight);
} }
else { else {
MxU8* surface = (MxU8*) desc.lpSurface; MxU8* surface = (MxU8*) desc.lpSurface;
const LegoU8* bits = image->GetBits(); LegoU8* bits = image->GetBits();
for (MxS32 i = 0; i < desc.dwHeight; i++) { for (MxS32 i = 0; i < desc.dwHeight; i++) {
memcpy(surface, bits, desc.dwWidth); memcpy(bits, surface, desc.dwWidth);
surface += desc.lPitch; surface += desc.lPitch;
bits += desc.dwWidth; bits += desc.dwWidth;
} }
@ -765,11 +765,11 @@ void WriteNamedTexture(LegoStorage* p_storage, LegoNamedTexture* p_namedTexture)
} }
// FUNCTION: LEGO1 0x1003f930 // FUNCTION: LEGO1 0x1003f930
void FUN_1003f930(LegoNamedTexture* p_namedTexture) void LoadFromNamedTexture(LegoNamedTexture* p_namedTexture)
{ {
LegoTextureInfo* textureInfo = TextureContainer()->Get(p_namedTexture->GetName()->GetData()); LegoTextureInfo* textureInfo = TextureContainer()->Get(p_namedTexture->GetName()->GetData());
if (textureInfo != NULL) { if (textureInfo != NULL) {
textureInfo->FUN_10066010(p_namedTexture->GetTexture()->GetImage()->GetBits()); textureInfo->LoadBits(p_namedTexture->GetTexture()->GetImage()->GetBits());
} }
} }

View File

@ -1,6 +1,7 @@
#include "legovariables.h" #include "legovariables.h"
#include "3dmanager/lego3dmanager.h" #include "3dmanager/lego3dmanager.h"
#include "legoactor.h"
#include "legogamestate.h" #include "legogamestate.h"
#include "legonavcontroller.h" #include "legonavcontroller.h"
#include "legovideomanager.h" #include "legovideomanager.h"
@ -157,18 +158,18 @@ void WhoAmIVariable::SetValue(const char* p_value)
MxVariable::SetValue(p_value); MxVariable::SetValue(p_value);
if (!strcmpi(p_value, g_papa)) { if (!strcmpi(p_value, g_papa)) {
GameState()->SetActorId(3); GameState()->SetActorId(LegoActor::c_papa);
} }
else if (!strcmpi(p_value, g_mama)) { else if (!strcmpi(p_value, g_mama)) {
GameState()->SetActorId(2); GameState()->SetActorId(LegoActor::c_mama);
} }
else if (!strcmpi(p_value, g_pepper)) { else if (!strcmpi(p_value, g_pepper)) {
GameState()->SetActorId(1); GameState()->SetActorId(LegoActor::c_pepper);
} }
else if (!strcmpi(p_value, g_nick)) { else if (!strcmpi(p_value, g_nick)) {
GameState()->SetActorId(4); GameState()->SetActorId(LegoActor::c_nick);
} }
else if (!strcmpi(p_value, g_laura)) { else if (!strcmpi(p_value, g_laura)) {
GameState()->SetActorId(5); GameState()->SetActorId(LegoActor::c_laura);
} }
} }

View File

@ -84,7 +84,7 @@ MxResult MxCompositeMediaPresenter::StartAction(MxStreamController* p_controller
if (!m_compositePresenter) { if (!m_compositePresenter) {
SetTickleState(e_ready); SetTickleState(e_ready);
MxLong time = Timer()->GetTime(); MxLong time = Timer()->GetTime();
m_action->SetUnknown90(time); m_action->SetTimeStarted(time);
} }
result = SUCCESS; result = SUCCESS;
@ -134,7 +134,7 @@ void MxCompositeMediaPresenter::StartingTickle()
if (!m_unk0x4c) { if (!m_unk0x4c) {
ProgressTickleState(e_streaming); ProgressTickleState(e_streaming);
MxLong time = Timer()->GetTime(); MxLong time = Timer()->GetTime();
m_action->SetUnknown90(time); m_action->SetTimeStarted(time);
} }
} }
} }
@ -144,7 +144,7 @@ MxResult MxCompositeMediaPresenter::Tickle()
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
switch (m_currentTickleState) { switch (GetCurrentTickleState()) {
case e_ready: case e_ready:
ProgressTickleState(e_starting); ProgressTickleState(e_starting);
case e_starting: case e_starting:

View File

@ -16,26 +16,26 @@ DECOMP_SIZE_ASSERT(MxControlPresenter, 0x5c)
// FUNCTION: LEGO1 0x10043f50 // FUNCTION: LEGO1 0x10043f50
MxControlPresenter::MxControlPresenter() MxControlPresenter::MxControlPresenter()
{ {
m_unk0x4c = 0; m_style = e_none;
m_unk0x4e = -1; m_enabledChild = -1;
m_unk0x50 = FALSE; m_unk0x50 = FALSE;
m_unk0x52 = 0; m_columnsOrRows = 0;
m_states = NULL; m_states = NULL;
m_unk0x54 = 0; m_rowsOrColumns = 0;
} }
// FUNCTION: LEGO1 0x10044110 // FUNCTION: LEGO1 0x10044110
MxControlPresenter::~MxControlPresenter() MxControlPresenter::~MxControlPresenter()
{ {
if (m_states) { if (m_states) {
delete m_states; delete[] m_states;
} }
} }
// FUNCTION: LEGO1 0x10044180 // FUNCTION: LEGO1 0x10044180
MxResult MxControlPresenter::AddToManager() MxResult MxControlPresenter::AddToManager()
{ {
m_unk0x4e = 0; m_enabledChild = 0;
return SUCCESS; return SUCCESS;
} }
@ -44,16 +44,16 @@ MxResult MxControlPresenter::StartAction(MxStreamController* p_controller, MxDSA
{ {
MxResult result = MxCompositePresenter::StartAction(p_controller, p_action); MxResult result = MxCompositePresenter::StartAction(p_controller, p_action);
FUN_100b7220(m_action, MxDSAction::c_world | MxDSAction::c_looping, TRUE); ApplyMask(m_action, MxDSAction::c_world | MxDSAction::c_looping, TRUE);
ParseExtra(); ParseExtra();
MxS16 i = 0; MxS16 i = 0;
for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) { for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) {
(*it)->Enable((m_unk0x4c != 3 || m_unk0x4e) && IsEnabled() ? m_unk0x4e == i : FALSE); (*it)->Enable((m_style != e_map || m_enabledChild) && IsEnabled() ? m_enabledChild == i : FALSE);
i++; i++;
} }
if (m_unk0x4c == 3) { if (m_style == e_map) {
MxDSAction* action = (*m_list.begin())->GetAction(); MxDSAction* action = (*m_list.begin())->GetAction();
action->SetFlags(action->GetFlags() | MxDSAction::c_bit11); action->SetFlags(action->GetFlags() | MxDSAction::c_bit11);
} }
@ -74,12 +74,12 @@ void MxControlPresenter::EndAction()
// FUNCTION: LEGO1 0x10044270 // FUNCTION: LEGO1 0x10044270
// FUNCTION: BETA10 0x100eae68 // FUNCTION: BETA10 0x100eae68
MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxPresenter* p_presenter) MxBool MxControlPresenter::CheckButtonDown(MxS32 p_x, MxS32 p_y, MxPresenter* p_presenter)
{ {
assert(p_presenter); assert(p_presenter);
MxStillPresenter* presenter = (MxStillPresenter*) p_presenter; MxVideoPresenter* presenter = (MxVideoPresenter*) p_presenter;
if (m_unk0x4c == 3) { if (m_style == e_map) {
MxStillPresenter* map = (MxStillPresenter*) m_list.front(); MxStillPresenter* map = (MxStillPresenter*) m_list.front();
assert(map && map->IsA("MxStillPresenter")); assert(map && map->IsA("MxStillPresenter"));
@ -94,23 +94,23 @@ MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxPresenter* p_pre
? NULL ? NULL
: map->GetBitmap()->GetStart(p_x - rect.GetLeft(), p_y - rect.GetTop()); : map->GetBitmap()->GetStart(p_x - rect.GetLeft(), p_y - rect.GetTop());
m_unk0x56 = 0; m_stateOrCellIndex = 0;
if (m_states) { if (m_states) {
for (MxS16 i = 1; i <= *m_states; i++) { for (MxS16 i = 1; i <= *m_states; i++) {
// TODO: Can we match without the cast here? // TODO: Can we match without the cast here?
if (m_states[i] == (MxS16) *start) { if (m_states[i] == (MxS16) *start) {
m_unk0x56 = i; m_stateOrCellIndex = i;
break; break;
} }
} }
} }
else { else {
if (*start != 0) { if (*start != 0) {
m_unk0x56 = 1; m_stateOrCellIndex = 1;
} }
} }
if (m_unk0x56) { if (m_stateOrCellIndex) {
return TRUE; return TRUE;
} }
} }
@ -119,21 +119,21 @@ MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxPresenter* p_pre
} }
else { else {
if (ContainsPresenter(m_list, presenter)) { if (ContainsPresenter(m_list, presenter)) {
if (m_unk0x4c == 2) { if (m_style == e_grid) {
MxS32 width = presenter->GetWidth(); MxS32 width = presenter->GetWidth();
MxS32 height = presenter->GetHeight(); MxS32 height = presenter->GetHeight();
if (m_unk0x52 == 2 && m_unk0x54 == 2) { if (m_columnsOrRows == 2 && m_rowsOrColumns == 2) {
if (p_x < presenter->GetX() + width / 2) { if (p_x < presenter->GetX() + width / 2) {
m_unk0x56 = (p_y >= presenter->GetY() + height / 2) ? 3 : 1; m_stateOrCellIndex = (p_y >= presenter->GetY() + height / 2) ? 3 : 1;
} }
else { else {
m_unk0x56 = (p_y >= presenter->GetY() + height / 2) ? 4 : 2; m_stateOrCellIndex = (p_y >= presenter->GetY() + height / 2) ? 4 : 2;
} }
} }
} }
else { else {
m_unk0x56 = -1; m_stateOrCellIndex = -1;
} }
return TRUE; return TRUE;
@ -144,27 +144,27 @@ MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxPresenter* p_pre
} }
// FUNCTION: LEGO1 0x10044480 // FUNCTION: LEGO1 0x10044480
MxBool MxControlPresenter::FUN_10044480(LegoControlManagerNotificationParam* p_param, MxPresenter* p_presenter) MxBool MxControlPresenter::Notify(LegoControlManagerNotificationParam* p_param, MxPresenter* p_presenter)
{ {
if (IsEnabled()) { if (IsEnabled()) {
switch (p_param->GetNotification()) { switch (p_param->GetNotification()) {
case c_notificationButtonUp: case c_notificationButtonUp:
if (m_unk0x4c == 0 || m_unk0x4c == 2 || m_unk0x4c == 3) { if (m_style == e_none || m_style == e_grid || m_style == e_map) {
p_param->SetClickedObjectId(m_action->GetObjectId()); p_param->SetClickedObjectId(m_action->GetObjectId());
p_param->SetClickedAtom(m_action->GetAtomId().GetInternal()); p_param->SetClickedAtom(m_action->GetAtomId().GetInternal());
VTable0x6c(0); UpdateEnabledChild(0);
p_param->SetNotification(c_notificationControl); p_param->SetNotification(c_notificationControl);
p_param->SetUnknown0x28(m_unk0x4e); p_param->SetUnknown0x28(m_enabledChild);
return TRUE; return TRUE;
} }
break; break;
case c_notificationButtonDown: case c_notificationButtonDown:
if (FUN_10044270(p_param->GetX(), p_param->GetY(), p_presenter)) { if (CheckButtonDown(p_param->GetX(), p_param->GetY(), p_presenter)) {
p_param->SetClickedObjectId(m_action->GetObjectId()); p_param->SetClickedObjectId(m_action->GetObjectId());
p_param->SetClickedAtom(m_action->GetAtomId().GetInternal()); p_param->SetClickedAtom(m_action->GetAtomId().GetInternal());
VTable0x6c(m_unk0x56); UpdateEnabledChild(m_stateOrCellIndex);
p_param->SetNotification(c_notificationControl); p_param->SetNotification(c_notificationControl);
p_param->SetUnknown0x28(m_unk0x4e); p_param->SetUnknown0x28(m_enabledChild);
return TRUE; return TRUE;
} }
break; break;
@ -175,25 +175,25 @@ MxBool MxControlPresenter::FUN_10044480(LegoControlManagerNotificationParam* p_p
} }
// FUNCTION: LEGO1 0x10044540 // FUNCTION: LEGO1 0x10044540
void MxControlPresenter::VTable0x6c(MxS16 p_unk0x4e) void MxControlPresenter::UpdateEnabledChild(MxS16 p_enabledChild)
{ {
if (p_unk0x4e == -1) { if (p_enabledChild == -1) {
if ((MxS16) ((MxDSMultiAction*) m_action)->GetActionList()->GetNumElements() - m_unk0x4e == 1) { if ((MxS16) ((MxDSMultiAction*) m_action)->GetActionList()->GetNumElements() - m_enabledChild == 1) {
m_unk0x4e = 0; m_enabledChild = 0;
} }
else { else {
m_unk0x4e++; m_enabledChild++;
} }
} }
else { else {
m_unk0x4e = p_unk0x4e; m_enabledChild = p_enabledChild;
} }
m_action->SetUnknown90(Timer()->GetTime()); m_action->SetTimeStarted(Timer()->GetTime());
MxS16 i = 0; MxS16 i = 0;
for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) { for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) {
(*it)->Enable(((m_unk0x4c == 3 && m_unk0x4e == 0) || !IsEnabled()) ? FALSE : m_unk0x4e == i); (*it)->Enable(((m_style == e_map && m_enabledChild == 0) || !IsEnabled()) ? FALSE : m_enabledChild == i);
i++; i++;
} }
} }
@ -224,20 +224,20 @@ void MxControlPresenter::ParseExtra()
char* token = strtok(output, g_parseExtraTokens); char* token = strtok(output, g_parseExtraTokens);
if (!strcmpi(token, g_strTOGGLE)) { if (!strcmpi(token, g_strTOGGLE)) {
m_unk0x4c = 1; m_style = e_toggle;
} }
else if (!strcmpi(token, g_strGRID)) { else if (!strcmpi(token, g_strGRID)) {
m_unk0x4c = 2; m_style = e_grid;
token = strtok(NULL, g_parseExtraTokens); token = strtok(NULL, g_parseExtraTokens);
assert(token); assert(token);
m_unk0x52 = atoi(token); m_columnsOrRows = atoi(token);
token = strtok(NULL, g_parseExtraTokens); token = strtok(NULL, g_parseExtraTokens);
assert(token); assert(token);
m_unk0x54 = atoi(token); m_rowsOrColumns = atoi(token);
} }
else if (!strcmpi(token, g_strMAP)) { else if (!strcmpi(token, g_strMAP)) {
m_unk0x4c = 3; m_style = e_map;
token = strtok(NULL, g_parseExtraTokens); token = strtok(NULL, g_parseExtraTokens);
if (token) { if (token) {
@ -254,7 +254,7 @@ void MxControlPresenter::ParseExtra()
} }
} }
else { else {
m_unk0x4c = 0; m_style = e_none;
} }
} }
@ -274,8 +274,8 @@ void MxControlPresenter::Enable(MxBool p_enable)
MxS16 i = 0; MxS16 i = 0;
for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) { for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) {
if (i == m_unk0x4e) { if (i == m_enabledChild) {
(*it)->Enable((m_unk0x4c != 3 || i != 0) ? p_enable : 0); (*it)->Enable((m_style != e_map || i != 0) ? p_enable : 0);
break; break;
} }
@ -283,7 +283,7 @@ void MxControlPresenter::Enable(MxBool p_enable)
} }
if (!p_enable) { if (!p_enable) {
m_unk0x4e = 0; m_enabledChild = 0;
} }
} }
} }
@ -294,10 +294,10 @@ MxBool MxControlPresenter::HasTickleStatePassed(TickleState p_tickleState)
MxCompositePresenterList::const_iterator it = m_list.begin(); MxCompositePresenterList::const_iterator it = m_list.begin();
#ifdef COMPAT_MODE #ifdef COMPAT_MODE
advance(it, m_unk0x4e); advance(it, m_enabledChild);
#else #else
// Uses forward iterator logic instead of bidrectional for some reason. // Uses forward iterator logic instead of bidrectional for some reason.
_Advance(it, m_unk0x4e, forward_iterator_tag()); _Advance(it, m_enabledChild, forward_iterator_tag());
#endif #endif
return (*it)->HasTickleStatePassed(p_tickleState); return (*it)->HasTickleStatePassed(p_tickleState);

View File

@ -93,7 +93,9 @@ MxResult MxTransitionManager::StartTransition(
MxBool p_playMusicInAnim MxBool p_playMusicInAnim
) )
{ {
#ifdef BETA10
assert(m_mode == e_idle); assert(m_mode == e_idle);
#endif
if (m_mode == e_idle) { if (m_mode == e_idle) {
if (!p_playMusicInAnim) { if (!p_playMusicInAnim) {
@ -291,10 +293,10 @@ void MxTransitionManager::MosaicTransition()
memset(&ddsd, 0, sizeof(ddsd)); memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd); ddsd.dwSize = sizeof(ddsd);
HRESULT res = m_ddSurface->Lock(NULL, &ddsd, 1, NULL); HRESULT res = m_ddSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
if (res == DDERR_SURFACELOST) { if (res == DDERR_SURFACELOST) {
m_ddSurface->Restore(); m_ddSurface->Restore();
res = m_ddSurface->Lock(NULL, &ddsd, 1, NULL); res = m_ddSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
} }
if (res == DD_OK) { if (res == DD_OK) {

View File

@ -17,10 +17,10 @@ DECOMP_SIZE_ASSERT(LegoEventNotificationParam, 0x20)
LegoControlManager::LegoControlManager() LegoControlManager::LegoControlManager()
{ {
m_presenterList = NULL; m_presenterList = NULL;
m_unk0x08 = 0; m_buttonDownState = e_idle;
m_unk0x0c = 0; m_handleUpNextTickle = 0;
m_unk0x10 = FALSE; m_secondButtonDown = FALSE;
m_unk0x14 = NULL; m_handledPresenter = NULL;
TickleManager()->RegisterClient(this, 10); TickleManager()->RegisterClient(this, 10);
} }
@ -31,11 +31,11 @@ LegoControlManager::~LegoControlManager()
} }
// FUNCTION: LEGO1 0x10028df0 // FUNCTION: LEGO1 0x10028df0
void LegoControlManager::FUN_10028df0(MxPresenterList* p_presenterList) void LegoControlManager::SetPresenterList(MxPresenterList* p_presenterList)
{ {
m_presenterList = p_presenterList; m_presenterList = p_presenterList;
g_unk0x100f31b0 = -1; g_clickedObjectId = -1;
g_unk0x100f31b4 = NULL; g_clickedAtom = NULL;
} }
// FUNCTION: LEGO1 0x10028e10 // FUNCTION: LEGO1 0x10028e10
@ -56,10 +56,10 @@ void LegoControlManager::Unregister(MxCore* p_listener)
} }
// FUNCTION: LEGO1 0x10029210 // FUNCTION: LEGO1 0x10029210
MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter) MxBool LegoControlManager::HandleButtonDown(LegoEventNotificationParam& p_param, MxPresenter* p_presenter)
{ {
if (m_presenterList != NULL && m_presenterList->GetNumElements() != 0) { if (m_presenterList != NULL && m_presenterList->GetNumElements() != 0) {
m_unk0x14 = p_presenter; m_handledPresenter = p_presenter;
if (p_param.GetNotification() == c_notificationButtonUp || if (p_param.GetNotification() == c_notificationButtonUp ||
p_param.GetNotification() == c_notificationButtonDown) { p_param.GetNotification() == c_notificationButtonDown) {
@ -71,28 +71,28 @@ MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxP
m_event.SetKey(p_param.GetKey()); m_event.SetKey(p_param.GetKey());
if (p_param.GetNotification() == c_notificationButtonUp) { if (p_param.GetNotification() == c_notificationButtonUp) {
if (m_unk0x10 == TRUE) { if (m_secondButtonDown == TRUE) {
m_unk0x10 = FALSE; m_secondButtonDown = FALSE;
return TRUE; return TRUE;
} }
if (g_unk0x100f31b0 != -1 && g_unk0x100f31b4 != NULL) { if (g_clickedObjectId != -1 && g_clickedAtom != NULL) {
if (m_unk0x08 == 2) { if (m_buttonDownState == e_tickled) {
return FUN_10029750(); return HandleButtonUp();
} }
else { else {
m_unk0x0c = 1; m_handleUpNextTickle = 1;
return TRUE; return TRUE;
} }
} }
} }
else if (p_param.GetNotification() == c_notificationButtonDown) { else if (p_param.GetNotification() == c_notificationButtonDown) {
if (m_unk0x0c == 1) { if (m_handleUpNextTickle == 1) {
m_unk0x10 = TRUE; m_secondButtonDown = TRUE;
return TRUE; return TRUE;
} }
else { else {
return FUN_10029630(); return HandleButtonDown();
} }
} }
} }
@ -100,15 +100,15 @@ MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxP
return FALSE; return FALSE;
} }
else { else {
g_unk0x100f31b0 = -1; g_clickedObjectId = -1;
g_unk0x100f31b4 = NULL; g_clickedAtom = NULL;
return FALSE; return FALSE;
} }
} }
// FUNCTION: LEGO1 0x100292e0 // FUNCTION: LEGO1 0x100292e0
void LegoControlManager::FUN_100292e0() void LegoControlManager::Notify()
{ {
LegoNotifyListCursor cursor(&m_notifyList); LegoNotifyListCursor cursor(&m_notifyList);
MxCore* target; MxCore* target;
@ -121,7 +121,7 @@ void LegoControlManager::FUN_100292e0()
} }
// FUNCTION: LEGO1 0x100293c0 // FUNCTION: LEGO1 0x100293c0
void LegoControlManager::FUN_100293c0(MxU32 p_objectId, const char* p_atom, MxS16 p_unk0x4e) void LegoControlManager::UpdateEnabledChild(MxU32 p_objectId, const char* p_atom, MxS16 p_enabledChild)
{ {
if (m_presenterList) { if (m_presenterList) {
MxPresenterListCursor cursor(m_presenterList); MxPresenterListCursor cursor(m_presenterList);
@ -131,11 +131,11 @@ void LegoControlManager::FUN_100293c0(MxU32 p_objectId, const char* p_atom, MxS1
MxDSAction* action = control->GetAction(); MxDSAction* action = control->GetAction();
if (action->GetObjectId() == p_objectId && action->GetAtomId().GetInternal() == p_atom) { if (action->GetObjectId() == p_objectId && action->GetAtomId().GetInternal() == p_atom) {
((MxControlPresenter*) control)->VTable0x6c(p_unk0x4e); ((MxControlPresenter*) control)->UpdateEnabledChild(p_enabledChild);
if (((MxControlPresenter*) control)->GetUnknown0x4e() == 0) { if (((MxControlPresenter*) control)->GetEnabledChild() == 0) {
g_unk0x100f31b0 = -1; g_clickedObjectId = -1;
g_unk0x100f31b4 = NULL; g_clickedAtom = NULL;
break; break;
} }
} }
@ -145,7 +145,7 @@ void LegoControlManager::FUN_100293c0(MxU32 p_objectId, const char* p_atom, MxS1
// FUNCTION: LEGO1 0x100294e0 // FUNCTION: LEGO1 0x100294e0
// FUNCTION: BETA10 0x1007c92f // FUNCTION: BETA10 0x1007c92f
MxControlPresenter* LegoControlManager::FUN_100294e0(MxS32 p_x, MxS32 p_y) MxControlPresenter* LegoControlManager::GetControlAt(MxS32 p_x, MxS32 p_y)
{ {
if (m_presenterList) { if (m_presenterList) {
MxPresenterListCursor cursor(m_presenterList); MxPresenterListCursor cursor(m_presenterList);
@ -154,7 +154,7 @@ MxControlPresenter* LegoControlManager::FUN_100294e0(MxS32 p_x, MxS32 p_y)
if (presenter) { if (presenter) {
while (cursor.Next(control)) { while (cursor.Next(control)) {
if (((MxControlPresenter*) control)->FUN_10044270(p_x, p_y, presenter)) { if (((MxControlPresenter*) control)->CheckButtonDown(p_x, p_y, presenter)) {
return (MxControlPresenter*) control; return (MxControlPresenter*) control;
} }
} }
@ -167,29 +167,29 @@ MxControlPresenter* LegoControlManager::FUN_100294e0(MxS32 p_x, MxS32 p_y)
// FUNCTION: LEGO1 0x10029600 // FUNCTION: LEGO1 0x10029600
MxResult LegoControlManager::Tickle() MxResult LegoControlManager::Tickle()
{ {
if (m_unk0x08 == 2 && m_unk0x0c == 1) { if (m_buttonDownState == e_tickled && m_handleUpNextTickle == 1) {
m_event.SetNotification(c_notificationButtonUp); m_event.SetNotification(c_notificationButtonUp);
FUN_10029750(); HandleButtonUp();
return 0; return 0;
} }
else if (m_unk0x08 == 1) { else if (m_buttonDownState == e_waitNextTickle) {
m_unk0x08 = 2; m_buttonDownState = e_tickled;
} }
return 0; return 0;
} }
// FUNCTION: LEGO1 0x10029630 // FUNCTION: LEGO1 0x10029630
MxBool LegoControlManager::FUN_10029630() MxBool LegoControlManager::HandleButtonDown()
{ {
MxPresenterListCursor cursor(m_presenterList); MxPresenterListCursor cursor(m_presenterList);
MxPresenter* presenter; MxPresenter* presenter;
while (cursor.Next(presenter)) { while (cursor.Next(presenter)) {
if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) { if (((MxControlPresenter*) presenter)->Notify(&m_event, m_handledPresenter)) {
g_unk0x100f31b0 = m_event.m_clickedObjectId; g_clickedObjectId = m_event.m_clickedObjectId;
g_unk0x100f31b4 = m_event.GetClickedAtom(); g_clickedAtom = m_event.GetClickedAtom();
FUN_100292e0(); Notify();
m_unk0x08 = 1; m_buttonDownState = e_waitNextTickle;
return TRUE; return TRUE;
} }
} }
@ -198,29 +198,29 @@ MxBool LegoControlManager::FUN_10029630()
} }
// FUNCTION: LEGO1 0x10029750 // FUNCTION: LEGO1 0x10029750
MxBool LegoControlManager::FUN_10029750() MxBool LegoControlManager::HandleButtonUp()
{ {
MxPresenterListCursor cursor(m_presenterList); MxPresenterListCursor cursor(m_presenterList);
MxPresenter* presenter; MxPresenter* presenter;
while (cursor.Next(presenter)) { while (cursor.Next(presenter)) {
if (presenter->GetAction() && presenter->GetAction()->GetObjectId() == g_unk0x100f31b0 && if (presenter->GetAction() && presenter->GetAction()->GetObjectId() == g_clickedObjectId &&
presenter->GetAction()->GetAtomId().GetInternal() == g_unk0x100f31b4) { presenter->GetAction()->GetAtomId().GetInternal() == g_clickedAtom) {
if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) { if (((MxControlPresenter*) presenter)->Notify(&m_event, m_handledPresenter)) {
FUN_100292e0(); Notify();
} }
g_unk0x100f31b0 = -1; g_clickedObjectId = -1;
g_unk0x100f31b4 = NULL; g_clickedAtom = NULL;
m_unk0x08 = 0; m_buttonDownState = e_idle;
m_unk0x0c = 0; m_handleUpNextTickle = 0;
return TRUE; return TRUE;
} }
} }
g_unk0x100f31b0 = -1; g_clickedObjectId = -1;
g_unk0x100f31b4 = NULL; g_clickedAtom = NULL;
return FALSE; return FALSE;
} }

View File

@ -27,7 +27,7 @@ LegoMeterPresenter::LegoMeterPresenter()
// FUNCTION: BETA10 0x1009764a // FUNCTION: BETA10 0x1009764a
LegoMeterPresenter::~LegoMeterPresenter() LegoMeterPresenter::~LegoMeterPresenter()
{ {
delete m_meterPixels; delete[] m_meterPixels;
} }
// FUNCTION: LEGO1 0x10043800 // FUNCTION: LEGO1 0x10043800

View File

@ -108,8 +108,8 @@ void Act2Brick::FUN_1007a670(MxMatrix& p_param1, MxMatrix& p_param2, LegoPathBou
p_boundary->AddActor(this); p_boundary->AddActor(this);
SetActorState(c_disabled); SetActorState(c_disabled);
m_roi->FUN_100a58f0(p_param1); m_roi->SetLocal2World(p_param1);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
m_roi->SetVisibility(TRUE); m_roi->SetVisibility(TRUE);
} }
@ -147,8 +147,8 @@ MxResult Act2Brick::Tickle()
VPV3(local2world[3], local2world[3], m_unk0x168); VPV3(local2world[3], local2world[3], m_unk0x168);
} }
m_roi->FUN_100a58f0(local2world); m_roi->SetLocal2World(local2world);
m_roi->VTable0x14(); m_roi->WrappedUpdateWorldData();
return SUCCESS; return SUCCESS;
} }

View File

@ -18,11 +18,12 @@ LegoActor::LegoActor()
m_frequencyFactor = 0.0f; m_frequencyFactor = 0.0f;
m_sound = NULL; m_sound = NULL;
m_unk0x70 = 0.0f; m_unk0x70 = 0.0f;
m_unk0x10 = 0; m_interaction = 0;
m_actorId = 0; m_actorId = 0;
} }
// FUNCTION: LEGO1 0x1002d320 // FUNCTION: LEGO1 0x1002d320
// FUNCTION: BETA10 0x1003d08b
LegoActor::~LegoActor() LegoActor::~LegoActor()
{ {
if (m_sound) { if (m_sound) {
@ -31,6 +32,7 @@ LegoActor::~LegoActor()
} }
// FUNCTION: LEGO1 0x1002d390 // FUNCTION: LEGO1 0x1002d390
// FUNCTION: BETA10 0x1003d10b
void LegoActor::ParseAction(char* p_extra) void LegoActor::ParseAction(char* p_extra)
{ {
MxFloat speed = 0.0F; MxFloat speed = 0.0F;
@ -90,6 +92,8 @@ void LegoActor::ParseAction(char* p_extra)
up[2] = atof(token); up[2] = atof(token);
} }
assert(token);
SetWorldTransform(location, direction, up); SetWorldTransform(location, direction, up);
} }
else { else {
@ -122,6 +126,7 @@ const char* LegoActor::GetActorName(MxU8 p_id)
} }
// FUNCTION: LEGO1 0x1002d670 // FUNCTION: LEGO1 0x1002d670
// FUNCTION: BETA10 0x1003d65f
void LegoActor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) void LegoActor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2)
{ {
if (p_roi) { if (p_roi) {

View File

@ -172,7 +172,7 @@ void LegoCameraController::FUN_100123e0(const Matrix4& p_transform, MxU32 p_und)
} }
((TimeROI*) pov)->FUN_100a9b40(mat, Timer()->GetTime()); ((TimeROI*) pov)->FUN_100a9b40(mat, Timer()->GetTime());
pov->WrappedSetLocalTransform(mat); pov->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
m_lego3DView->Moved(*pov); m_lego3DView->Moved(*pov);
SoundManager()->UpdateListener( SoundManager()->UpdateListener(

View File

@ -29,7 +29,7 @@ void LegoEntity::Init()
m_roi = NULL; m_roi = NULL;
m_cameraFlag = FALSE; m_cameraFlag = FALSE;
m_siFile = NULL; m_siFile = NULL;
m_unk0x10 = 0; m_interaction = 0;
m_flags = 0; m_flags = 0;
m_actionType = Extra::ActionType::e_unknown; m_actionType = Extra::ActionType::e_unknown;
m_targetEntityId = -1; m_targetEntityId = -1;
@ -263,23 +263,23 @@ void LegoEntity::ParseAction(char* p_extra)
// FUNCTION: LEGO1 0x10010f10 // FUNCTION: LEGO1 0x10010f10
// FUNCTION: BETA10 0x1007ee87 // FUNCTION: BETA10 0x1007ee87
void LegoEntity::ClickSound(MxBool p_und) void LegoEntity::ClickSound(MxBool p_basedOnMood)
{ {
if (!GetUnknown0x10IsSet(c_altBit1)) { if (!IsInteraction(c_disabled)) {
MxU32 objectId = 0; MxU32 objectId = 0;
const char* name = m_roi->GetName(); const char* name = m_roi->GetName();
switch (m_type) { switch (m_type) {
case e_actor: case e_actor:
objectId = CharacterManager()->GetSoundId(m_roi, p_und); objectId = CharacterManager()->GetSoundId(m_roi, p_basedOnMood);
break; break;
case e_unk1: case e_unk1:
break; break;
case e_plant: case e_plant:
objectId = PlantManager()->GetSoundId(this, p_und); objectId = PlantManager()->GetSoundId(this, p_basedOnMood);
break; break;
case e_building: case e_building:
objectId = BuildingManager()->GetSoundId(this, p_und); objectId = BuildingManager()->GetSoundId(this, p_basedOnMood);
break; break;
} }
@ -297,7 +297,7 @@ void LegoEntity::ClickSound(MxBool p_und)
// FUNCTION: BETA10 0x1007f062 // FUNCTION: BETA10 0x1007f062
void LegoEntity::ClickAnimation() void LegoEntity::ClickAnimation()
{ {
if (!GetUnknown0x10IsSet(c_altBit1)) { if (!IsInteraction(c_disabled)) {
MxU32 objectId = 0; MxU32 objectId = 0;
MxDSAction action; MxDSAction action;
const char* name = m_roi->GetName(); const char* name = m_roi->GetName();
@ -329,7 +329,7 @@ void LegoEntity::ClickAnimation()
action.SetObjectId(objectId); action.SetObjectId(objectId);
action.AppendExtra(strlen(extra) + 1, extra); action.AppendExtra(strlen(extra) + 1, extra);
LegoOmni::GetInstance()->GetAnimationManager()->StartEntityAction(action, this); LegoOmni::GetInstance()->GetAnimationManager()->StartEntityAction(action, this);
m_unk0x10 |= c_altBit1; m_interaction |= c_disabled;
} }
} }
} }
@ -500,10 +500,10 @@ MxLong LegoEntity::Notify(MxParam& p_param)
case e_unk1: case e_unk1:
break; break;
case e_plant: case e_plant:
PlantManager()->FUN_10026c50(this); PlantManager()->DecrementCounter(this);
break; break;
case e_building: case e_building:
BuildingManager()->FUN_10030000(this); BuildingManager()->DecrementCounter(this);
break; break;
case e_autoROI: case e_autoROI:
break; break;

View File

@ -135,7 +135,7 @@ LegoNavController::LegoNavController()
m_rotationalAccel = 0.0f; m_rotationalAccel = 0.0f;
m_trackDefault = FALSE; m_trackDefault = FALSE;
m_unk0x5d = FALSE; m_unk0x5d = FALSE;
m_unk0x6c = FALSE; m_isAccelerating = FALSE;
m_unk0x64 = 0.0f; m_unk0x64 = 0.0f;
m_unk0x68 = 0.0f; m_unk0x68 = 0.0f;
m_unk0x60 = 0.0f; m_unk0x60 = 0.0f;
@ -442,8 +442,8 @@ MxResult LegoNavController::UpdateLocation(const char* p_location)
Mx3DPointFloat vec; Mx3DPointFloat vec;
vec.Clear(); vec.Clear();
viewROI->FUN_100a5a30(vec); viewROI->SetWorldVelocity(vec);
viewROI->WrappedSetLocalTransform(mat); viewROI->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
VideoManager()->Get3DManager()->Moved(*viewROI); VideoManager()->Get3DManager()->Moved(*viewROI);
SoundManager()->UpdateListener( SoundManager()->UpdateListener(
@ -480,8 +480,8 @@ MxResult LegoNavController::UpdateLocation(MxU32 p_location)
Mx3DPointFloat vec; Mx3DPointFloat vec;
vec.Clear(); vec.Clear();
viewROI->FUN_100a5a30(vec); viewROI->SetWorldVelocity(vec);
viewROI->WrappedSetLocalTransform(mat); viewROI->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
VideoManager()->Get3DManager()->Moved(*viewROI); VideoManager()->Get3DManager()->Moved(*viewROI);
SoundManager()->UpdateListener( SoundManager()->UpdateListener(
@ -564,8 +564,8 @@ MxResult LegoNavController::ProcessJoystickInput(MxBool& p_und)
// FUNCTION: LEGO1 0x100558b0 // FUNCTION: LEGO1 0x100558b0
MxResult LegoNavController::ProcessKeyboardInput() MxResult LegoNavController::ProcessKeyboardInput()
{ {
MxBool bool1 = FALSE; MxBool skipRotationVelAndAccelCalc = FALSE;
MxBool bool2 = FALSE; MxBool skipLinearVelAndAccelCalc = FALSE;
LegoInputManager* inputManager = LegoOmni::GetInstance()->GetInputManager(); LegoInputManager* inputManager = LegoOmni::GetInstance()->GetInputManager();
MxU32 keyFlags; MxU32 keyFlags;
@ -574,18 +574,18 @@ MxResult LegoNavController::ProcessKeyboardInput()
} }
if (keyFlags == 0) { if (keyFlags == 0) {
if (m_unk0x6c) { if (m_isAccelerating) {
m_targetRotationalVel = 0.0; m_targetRotationalVel = 0.0;
m_targetLinearVel = 0.0; m_targetLinearVel = 0.0;
m_rotationalAccel = m_maxRotationalDeccel; m_rotationalAccel = m_maxRotationalDeccel;
m_linearAccel = m_maxLinearDeccel; m_linearAccel = m_maxLinearDeccel;
m_unk0x6c = FALSE; m_isAccelerating = FALSE;
} }
return FAILURE; return FAILURE;
} }
m_unk0x6c = TRUE; m_isAccelerating = TRUE;
MxS32 hMax; MxS32 hMax;
switch (keyFlags & LegoInputManager::c_leftOrRight) { switch (keyFlags & LegoInputManager::c_leftOrRight) {
@ -598,7 +598,7 @@ MxResult LegoNavController::ProcessKeyboardInput()
default: default:
m_targetRotationalVel = 0.0; m_targetRotationalVel = 0.0;
m_rotationalAccel = m_maxRotationalDeccel; m_rotationalAccel = m_maxRotationalDeccel;
bool1 = TRUE; skipRotationVelAndAccelCalc = TRUE;
break; break;
} }
@ -613,23 +613,31 @@ MxResult LegoNavController::ProcessKeyboardInput()
default: default:
m_targetLinearVel = 0.0; m_targetLinearVel = 0.0;
m_linearAccel = m_maxLinearDeccel; m_linearAccel = m_maxLinearDeccel;
bool2 = TRUE; skipLinearVelAndAccelCalc = TRUE;
break; break;
} }
MxFloat val = keyFlags & LegoInputManager::c_bit5 ? 1.0f : 4.0f; MxFloat maxAccelDivisor = keyFlags & LegoInputManager::c_ctrl ? 1.0f : 4.0f;
MxFloat val2 = keyFlags & LegoInputManager::c_bit5 ? 1.0f : 2.0f; MxFloat minAccelDivisor = keyFlags & LegoInputManager::c_ctrl ? 1.0f : 2.0f;
if (!bool1) { if (!skipRotationVelAndAccelCalc) {
m_targetRotationalVel = CalculateNewTargetVel(hMax, m_hMax / 2, m_maxRotationalVel); m_targetRotationalVel = CalculateNewTargetVel(hMax, m_hMax / 2, m_maxRotationalVel);
m_rotationalAccel = m_rotationalAccel = CalculateNewAccel(
CalculateNewAccel(hMax, m_hMax / 2, m_maxRotationalAccel / val, (int) (m_minRotationalAccel / val2)); hMax,
m_hMax / 2,
m_maxRotationalAccel / maxAccelDivisor,
(int) (m_minRotationalAccel / minAccelDivisor)
);
} }
if (!bool2) { if (!skipLinearVelAndAccelCalc) {
m_targetLinearVel = CalculateNewTargetVel(m_vMax - vMax, m_vMax / 2, m_maxLinearVel); m_targetLinearVel = CalculateNewTargetVel(m_vMax - vMax, m_vMax / 2, m_maxLinearVel);
m_linearAccel = m_linearAccel = CalculateNewAccel(
CalculateNewAccel(m_vMax - vMax, m_vMax / 2, m_maxLinearAccel / val, (int) (m_minLinearAccel / val2)); m_vMax - vMax,
m_vMax / 2,
m_maxLinearAccel / maxAccelDivisor,
(int) (m_minLinearAccel / minAccelDivisor)
);
} }
return SUCCESS; return SUCCESS;
@ -683,7 +691,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
for (MxS32 i = 0; i < numPlants; i++) { for (MxS32 i = 0; i < numPlants; i++) {
LegoEntity* entity = plantMgr->CreatePlant(i, NULL, LegoOmni::e_act1); LegoEntity* entity = plantMgr->CreatePlant(i, NULL, LegoOmni::e_act1);
if (entity != NULL && !entity->GetUnknown0x10IsSet(LegoEntity::c_altBit1)) { if (entity != NULL && !entity->IsInteraction(LegoEntity::c_disabled)) {
LegoROI* roi = entity->GetROI(); LegoROI* roi = entity->GetROI();
if (roi != NULL && roi->GetVisibility()) { if (roi != NULL && roi->GetVisibility()) {
@ -693,7 +701,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
Mx3DPointFloat roiPosition(roi->GetWorldPosition()); Mx3DPointFloat roiPosition(roi->GetWorldPosition());
roiPosition -= viewPosition; roiPosition -= viewPosition;
if (roiPosition.LenSquared() < 2000.0 || roi->GetUnknown0xe0() > 0) { if (roiPosition.LenSquared() < 2000.0 || roi->GetLodLevel() > 0) {
entity->ClickAnimation(); entity->ClickAnimation();
} }
} }
@ -922,7 +930,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
MxMatrix mat; MxMatrix mat;
mat.SetIdentity(); mat.SetIdentity();
mat.RotateX(0.2618f); mat.RotateX(0.2618f);
roi->WrappedVTable0x24(mat); roi->WrappedUpdateWorldDataWithTransform(mat);
break; break;
} }
case 'J': { case 'J': {
@ -930,7 +938,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
MxMatrix mat; MxMatrix mat;
mat.SetIdentity(); mat.SetIdentity();
mat.RotateZ(0.2618f); mat.RotateZ(0.2618f);
roi->WrappedVTable0x24(mat); roi->WrappedUpdateWorldDataWithTransform(mat);
break; break;
} }
case 'K': { case 'K': {
@ -938,7 +946,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
LegoROI* roi = LegoOmni::GetInstance()->GetVideoManager()->GetViewROI(); LegoROI* roi = LegoOmni::GetInstance()->GetVideoManager()->GetViewROI();
mat.SetIdentity(); mat.SetIdentity();
mat.RotateZ(-0.2618f); mat.RotateZ(-0.2618f);
roi->WrappedVTable0x24(mat); roi->WrappedUpdateWorldDataWithTransform(mat);
break; break;
} }
case 'L': case 'L':
@ -949,7 +957,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
MxMatrix mat; MxMatrix mat;
mat.SetIdentity(); mat.SetIdentity();
mat.RotateX(-0.2618f); mat.RotateX(-0.2618f);
roi->WrappedVTable0x24(mat); roi->WrappedUpdateWorldDataWithTransform(mat);
break; break;
} }
case 'N': case 'N':

View File

@ -154,7 +154,7 @@ MxResult LegoPointOfViewController::Tickle()
CalcLocalTransform(newPos, newDir, pov->GetWorldUp(), mat); CalcLocalTransform(newPos, newDir, pov->GetWorldUp(), mat);
((TimeROI*) pov)->FUN_100a9b40(mat, Timer()->GetTime()); ((TimeROI*) pov)->FUN_100a9b40(mat, Timer()->GetTime());
pov->WrappedSetLocalTransform(mat); pov->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
m_lego3DView->Moved(*pov); m_lego3DView->Moved(*pov);
SoundManager()->UpdateListener( SoundManager()->UpdateListener(
@ -171,7 +171,7 @@ MxResult LegoPointOfViewController::Tickle()
Mx3DPointFloat vel; Mx3DPointFloat vel;
vel.Clear(); vel.Clear();
pov->FUN_100a5a30(vel); pov->SetWorldVelocity(vel);
SoundManager()->UpdateListener( SoundManager()->UpdateListener(
pov->GetWorldPosition(), pov->GetWorldPosition(),
@ -210,7 +210,7 @@ void LegoPointOfViewController::SetEntity(LegoEntity* p_entity)
mat mat
); );
pov->WrappedSetLocalTransform(mat); pov->WrappedSetLocal2WorldWithWorldDataUpdate(mat);
} }
else { else {
TickleManager()->RegisterClient(this, 10); TickleManager()->RegisterClient(this, 10);

View File

@ -32,7 +32,7 @@ DECOMP_SIZE_ASSERT(LegoCacheSoundList, 0x18)
DECOMP_SIZE_ASSERT(LegoCacheSoundListCursor, 0x10) DECOMP_SIZE_ASSERT(LegoCacheSoundListCursor, 0x10)
// FUNCTION: LEGO1 0x1001ca40 // FUNCTION: LEGO1 0x1001ca40
LegoWorld::LegoWorld() : m_list0x68(TRUE) LegoWorld::LegoWorld() : m_pathControllerList(TRUE)
{ {
m_startupTicks = e_four; m_startupTicks = e_four;
m_cameraController = NULL; m_cameraController = NULL;
@ -81,7 +81,7 @@ MxResult LegoWorld::Create(MxDSAction& p_dsAction)
} }
SetCurrentWorld(this); SetCurrentWorld(this);
ControlManager()->FUN_10028df0(&m_controlPresenters); ControlManager()->SetPresenterList(&m_controlPresenters);
} }
SetIsWorldActive(TRUE); SetIsWorldActive(TRUE);
@ -96,11 +96,11 @@ void LegoWorld::Destroy(MxBool p_fromDestructor)
m_destroyed = TRUE; m_destroyed = TRUE;
if (CurrentWorld() == this) { if (CurrentWorld() == this) {
ControlManager()->FUN_10028df0(NULL); ControlManager()->SetPresenterList(NULL);
SetCurrentWorld(NULL); SetCurrentWorld(NULL);
} }
m_list0x68.DeleteAll(); m_pathControllerList.DeleteAll();
if (m_cameraController) { if (m_cameraController) {
delete m_cameraController; delete m_cameraController;
@ -120,12 +120,12 @@ void LegoWorld::Destroy(MxBool p_fromDestructor)
animPresenter->DecrementUnknown0xd4(); animPresenter->DecrementUnknown0xd4();
if (animPresenter->GetUnknown0xd4() == 0) { if (animPresenter->GetUnknown0xd4() == 0) {
FUN_100b7220(action, MxDSAction::c_world, FALSE); ApplyMask(action, MxDSAction::c_world, FALSE);
presenter->EndAction(); presenter->EndAction();
} }
} }
else { else {
FUN_100b7220(action, MxDSAction::c_world, FALSE); ApplyMask(action, MxDSAction::c_world, FALSE);
presenter->EndAction(); presenter->EndAction();
} }
} }
@ -141,7 +141,7 @@ void LegoWorld::Destroy(MxBool p_fromDestructor)
MxDSAction* action = presenter->GetAction(); MxDSAction* action = presenter->GetAction();
if (action) { if (action) {
FUN_100b7220(action, MxDSAction::c_world, FALSE); ApplyMask(action, MxDSAction::c_world, FALSE);
presenter->EndAction(); presenter->EndAction();
} }
} }
@ -157,7 +157,7 @@ void LegoWorld::Destroy(MxBool p_fromDestructor)
MxDSAction* action = presenter->GetAction(); MxDSAction* action = presenter->GetAction();
if (action) { if (action) {
FUN_100b7220(action, MxDSAction::c_world, FALSE); ApplyMask(action, MxDSAction::c_world, FALSE);
presenter->EndAction(); presenter->EndAction();
} }
} }
@ -273,7 +273,7 @@ MxResult LegoWorld::PlaceActor(
float p_destScale float p_destScale
) )
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
@ -288,7 +288,7 @@ MxResult LegoWorld::PlaceActor(
// FUNCTION: LEGO1 0x1001fa70 // FUNCTION: LEGO1 0x1001fa70
MxResult LegoWorld::PlaceActor(LegoPathActor* p_actor) MxResult LegoWorld::PlaceActor(LegoPathActor* p_actor)
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
@ -308,7 +308,7 @@ MxResult LegoWorld::PlaceActor(
Vector3& p_direction Vector3& p_direction
) )
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
@ -324,7 +324,7 @@ MxResult LegoWorld::PlaceActor(
// FUNCTION: BETA10 0x100da4bf // FUNCTION: BETA10 0x100da4bf
void LegoWorld::RemoveActor(LegoPathActor* p_actor) void LegoWorld::RemoveActor(LegoPathActor* p_actor)
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
@ -337,7 +337,7 @@ void LegoWorld::RemoveActor(LegoPathActor* p_actor)
// FUNCTION: BETA10 0x100da560 // FUNCTION: BETA10 0x100da560
MxBool LegoWorld::ActorExists(LegoPathActor* p_actor) MxBool LegoWorld::ActorExists(LegoPathActor* p_actor)
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
@ -353,7 +353,7 @@ MxBool LegoWorld::ActorExists(LegoPathActor* p_actor)
// FUNCTION: BETA10 0x100da621 // FUNCTION: BETA10 0x100da621
void LegoWorld::FUN_1001fda0(LegoAnimPresenter* p_presenter) void LegoWorld::FUN_1001fda0(LegoAnimPresenter* p_presenter)
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
@ -365,11 +365,11 @@ void LegoWorld::FUN_1001fda0(LegoAnimPresenter* p_presenter)
// FUNCTION: BETA10 0x100da6b5 // FUNCTION: BETA10 0x100da6b5
void LegoWorld::FUN_1001fe90(LegoAnimPresenter* p_presenter) void LegoWorld::FUN_1001fe90(LegoAnimPresenter* p_presenter)
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
controller->FUN_10046930(p_presenter); controller->RemovePresenterFromBoundaries(p_presenter);
} }
} }
@ -377,14 +377,14 @@ void LegoWorld::FUN_1001fe90(LegoAnimPresenter* p_presenter)
void LegoWorld::AddPath(LegoPathController* p_controller) void LegoWorld::AddPath(LegoPathController* p_controller)
{ {
p_controller->FUN_10046bb0(this); p_controller->FUN_10046bb0(this);
m_list0x68.Append(p_controller); m_pathControllerList.Append(p_controller);
} }
// FUNCTION: LEGO1 0x10020020 // FUNCTION: LEGO1 0x10020020
// FUNCTION: BETA10 0x100da77c // FUNCTION: BETA10 0x100da77c
LegoPathBoundary* LegoWorld::FindPathBoundary(const char* p_name) LegoPathBoundary* LegoWorld::FindPathBoundary(const char* p_name)
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
while (cursor.Next(controller)) { while (cursor.Next(controller)) {
@ -401,7 +401,7 @@ LegoPathBoundary* LegoWorld::FindPathBoundary(const char* p_name)
// FUNCTION: LEGO1 0x10020120 // FUNCTION: LEGO1 0x10020120
MxResult LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_boundaries, MxS32& p_numL) MxResult LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_boundaries, MxS32& p_numL)
{ {
LegoPathControllerListCursor cursor(&m_list0x68); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
cursor.Next(controller); cursor.Next(controller);
@ -424,7 +424,7 @@ void LegoWorld::Add(MxCore* p_object)
#ifndef BETA10 #ifndef BETA10
if (p_object->IsA("LegoAnimPresenter")) { if (p_object->IsA("LegoAnimPresenter")) {
if (!strcmpi(((LegoAnimPresenter*) p_object)->GetAction()->GetObjectName(), "ConfigAnimation")) { if (!strcmpi(((LegoAnimPresenter*) p_object)->GetAction()->GetObjectName(), "ConfigAnimation")) {
FUN_1003e050((LegoAnimPresenter*) p_object); CalculateViewFromAnimation((LegoAnimPresenter*) p_object);
((LegoAnimPresenter*) p_object) ((LegoAnimPresenter*) p_object)
->GetAction() ->GetAction()
->SetDuration(((LegoAnimPresenter*) p_object)->GetAnimation()->GetDuration()); ->SetDuration(((LegoAnimPresenter*) p_object)->GetAnimation()->GetDuration());
@ -722,7 +722,7 @@ void LegoWorld::Enable(MxBool p_enable)
} }
SetCurrentWorld(this); SetCurrentWorld(this);
ControlManager()->FUN_10028df0(&m_controlPresenters); ControlManager()->SetPresenterList(&m_controlPresenters);
InputManager()->SetCamera(m_cameraController); InputManager()->SetCamera(m_cameraController);
if (m_cameraController) { if (m_cameraController) {
@ -779,7 +779,7 @@ void LegoWorld::Enable(MxBool p_enable)
} }
if (CurrentWorld() && CurrentWorld() == this) { if (CurrentWorld() && CurrentWorld() == this) {
ControlManager()->FUN_10028df0(NULL); ControlManager()->SetPresenterList(NULL);
Lego()->SetCurrentWorld(NULL); Lego()->SetCurrentWorld(NULL);
} }
@ -795,7 +795,7 @@ void LegoWorld::Enable(MxBool p_enable)
} }
} }
LegoPathControllerListCursor pathControllerCursor(&m_list0x68); LegoPathControllerListCursor pathControllerCursor(&m_pathControllerList);
while (pathControllerCursor.Next(controller)) { while (pathControllerCursor.Next(controller)) {
controller->Enable(FALSE); controller->Enable(FALSE);

Some files were not shown because too many files have changed in this diff Show More