From 706be168af9e3477d6166684ae740c51fa7357e7 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 27 Jun 2023 19:06:04 -0700 Subject: [PATCH 01/34] msvc: force update dependencies --- isle.mak | 37 ++++++++++++------------------------- isle.mdp | Bin 49664 -> 49664 bytes 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/isle.mak b/isle.mak index 899c2b03..ea007e37 100644 --- a/isle.mak +++ b/isle.mak @@ -34,7 +34,7 @@ NULL=nul !ENDIF ################################################################################ # Begin Project -# PROP Target_Last_Scanned "isle - Win32 Debug" +# PROP Target_Last_Scanned "ISLE - Win32 Debug" !IF "$(CFG)" == "LEGO1 - Win32 Release" @@ -487,8 +487,8 @@ LINK32_OBJS= \ SOURCE=.\LEGO1\mxcore.cpp DEP_CPP_MXCOR=\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ "$(INTDIR)\mxcore.obj" : $(SOURCE) $(DEP_CPP_MXCOR) "$(INTDIR)" @@ -566,7 +566,6 @@ DEP_CPP_LEGOO=\ SOURCE=.\LEGO1\mxcriticalsection.cpp DEP_CPP_MXCRI=\ - ".\LEGO1\legoinc.h"\ ".\LEGO1\mxcriticalsection.h"\ @@ -580,7 +579,6 @@ DEP_CPP_MXCRI=\ SOURCE=.\LEGO1\mxautolocker.cpp DEP_CPP_MXAUT=\ - ".\LEGO1\legoinc.h"\ ".\LEGO1\mxautolocker.h"\ ".\LEGO1\mxcriticalsection.h"\ @@ -610,9 +608,7 @@ DEP_CPP_MXTIM=\ SOURCE=.\LEGO1\mxomni.cpp DEP_CPP_MXOMN=\ - ".\LEGO1\legoinc.h"\ ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxcriticalsection.h"\ ".\LEGO1\mxeventmanager.h"\ @@ -632,6 +628,7 @@ DEP_CPP_MXOMN=\ ".\LEGO1\mxstring.h"\ ".\LEGO1\mxticklemanager.h"\ ".\LEGO1\mxtimer.h"\ + ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxunknown100dc6b0.h"\ ".\LEGO1\mxvariabletable.h"\ ".\LEGO1\mxvideomanager.h"\ @@ -649,12 +646,11 @@ DEP_CPP_MXOMN=\ SOURCE=.\LEGO1\mxvideoparam.cpp DEP_CPP_MXVID=\ - ".\LEGO1\legoinc.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ ".\LEGO1\mxresult.h"\ + ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxvariabletable.h"\ ".\LEGO1\mxvideoparam.h"\ ".\LEGO1\mxvideoparamflags.h"\ @@ -670,7 +666,6 @@ DEP_CPP_MXVID=\ SOURCE=.\LEGO1\mxvideoparamflags.cpp DEP_CPP_MXVIDE=\ - ".\LEGO1\legoinc.h"\ ".\LEGO1\mxvideoparamflags.h"\ @@ -684,8 +679,6 @@ DEP_CPP_MXVIDE=\ SOURCE=.\LEGO1\mxomnicreateparam.cpp DEP_CPP_MXOMNI=\ - ".\LEGO1\legoinc.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxomnicreateflags.h"\ ".\LEGO1\mxomnicreateparam.h"\ @@ -694,6 +687,7 @@ DEP_CPP_MXOMNI=\ ".\LEGO1\mxrect32.h"\ ".\LEGO1\mxresult.h"\ ".\LEGO1\mxstring.h"\ + ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxvariabletable.h"\ ".\LEGO1\mxvideoparam.h"\ ".\LEGO1\mxvideoparamflags.h"\ @@ -709,8 +703,6 @@ DEP_CPP_MXOMNI=\ SOURCE=.\LEGO1\mxomnicreateparambase.cpp DEP_CPP_MXOMNIC=\ - ".\LEGO1\legoinc.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxomnicreateflags.h"\ ".\LEGO1\mxomnicreateparam.h"\ @@ -719,6 +711,7 @@ DEP_CPP_MXOMNIC=\ ".\LEGO1\mxrect32.h"\ ".\LEGO1\mxresult.h"\ ".\LEGO1\mxstring.h"\ + ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxvariabletable.h"\ ".\LEGO1\mxvideoparam.h"\ ".\LEGO1\mxvideoparamflags.h"\ @@ -735,9 +728,9 @@ DEP_CPP_MXOMNIC=\ SOURCE=.\LEGO1\mxstring.cpp DEP_CPP_MXSTR=\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxstring.h"\ + ".\LEGO1\mxtypes.h"\ "$(INTDIR)\mxstring.obj" : $(SOURCE) $(DEP_CPP_MXSTR) "$(INTDIR)" @@ -821,9 +814,9 @@ DEP_CPP_LEGON=\ SOURCE=.\LEGO1\mxdsobject.cpp DEP_CPP_MXDSO=\ ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ "$(INTDIR)\mxdsobject.obj" : $(SOURCE) $(DEP_CPP_MXDSO) "$(INTDIR)" @@ -849,11 +842,10 @@ DEP_CPP_MXATO=\ SOURCE=.\LEGO1\mxunknown100dc6b0.cpp DEP_CPP_MXUNK=\ - ".\LEGO1\legoinc.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxcriticalsection.h"\ ".\LEGO1\mxresult.h"\ + ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxunknown100dc6b0.h"\ @@ -890,10 +882,10 @@ DEP_CPP_MXVIDEO=\ SOURCE=.\LEGO1\mxpalette.cpp DEP_CPP_MXPAL=\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxresult.h"\ + ".\LEGO1\mxtypes.h"\ "$(INTDIR)\mxpalette.obj" : $(SOURCE) $(DEP_CPP_MXPAL) "$(INTDIR)" @@ -906,7 +898,6 @@ DEP_CPP_MXPAL=\ SOURCE=.\LEGO1\mxioinfo.cpp DEP_CPP_MXIOI=\ - ".\LEGO1\legoinc.h"\ ".\LEGO1\mxioinfo.h"\ @@ -920,13 +911,12 @@ DEP_CPP_MXIOI=\ SOURCE=.\LEGO1\mxdsfile.cpp DEP_CPP_MXDSF=\ - ".\LEGO1\legoinc.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxdsfile.h"\ ".\LEGO1\mxdssource.h"\ ".\LEGO1\mxioinfo.h"\ ".\LEGO1\mxstring.h"\ + ".\LEGO1\mxtypes.h"\ "$(INTDIR)\mxdsfile.obj" : $(SOURCE) $(DEP_CPP_MXDSF) "$(INTDIR)" @@ -939,9 +929,9 @@ DEP_CPP_MXDSF=\ SOURCE=.\LEGO1\mxdssource.cpp DEP_CPP_MXDSS=\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxdssource.h"\ + ".\LEGO1\mxtypes.h"\ "$(INTDIR)\mxdssource.obj" : $(SOURCE) $(DEP_CPP_MXDSS) "$(INTDIR)" @@ -976,7 +966,6 @@ DEP_CPP_ISLE_=\ ".\LEGO1\legobuildingmanager.h"\ ".\LEGO1\legoentity.h"\ ".\LEGO1\legogamestate.h"\ - ".\LEGO1\legoinc.h"\ ".\LEGO1\legoinputmanager.h"\ ".\LEGO1\legomodelpresenter.h"\ ".\LEGO1\legonavcontroller.h"\ @@ -987,7 +976,6 @@ DEP_CPP_ISLE_=\ ".\LEGO1\legoworldpresenter.h"\ ".\LEGO1\mxatomid.h"\ ".\LEGO1\mxbackgroundaudiomanager.h"\ - ".\LEGO1\mxbool.h"\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxcriticalsection.h"\ ".\LEGO1\mxdirectdraw.h"\ @@ -1473,7 +1461,6 @@ SOURCE=.\LEGO1\mxatomid.h SOURCE=.\ISLE\define.cpp DEP_CPP_DEFIN=\ ".\ISLE\define.h"\ - ".\LEGO1\legoinc.h"\ "$(INTDIR)\define.obj" : $(SOURCE) $(DEP_CPP_DEFIN) "$(INTDIR)" diff --git a/isle.mdp b/isle.mdp index d86f4dbf53b7652cd6e1bf1e9c389e342ba0ef2a..56789362a8e8383ca4db0ab95d5f19ac0cc4e1d1 100644 GIT binary patch delta 308 zcmZo@VQy$)-oVSX`8O9U|3rm%{L$6S3@i+8j58P}F+{LT+We90BjY9+ex}V|xOjjH zo?=&Eki@k4GZ!yV!9?r|TnH(Mm?1rRcd^3e|HWHbCnr?0Oy;Uq*!*Au3*+P+ReqDT zCuvRIS*(OZR%$lS<}Xcm*(b->=x$c(-iKDu W;sb^SI5=J~O=7sgw3%<;CuRU${%sck delta 906 zcmZo@VQy$)-oVRMA8xFm?;fF`AC;+~?{B1_@2Q~V1S*NVfwka zI)%DJ*zrJd7ys~JAkVEp$uro;H6|!ECpED+RUgFBD@e`&N<{*Vb<0PU2I)va65;}C z0g5Fna4Aim7%ev0A&Qq-3C?EaNl8u1%uCfvE+|mq+APQ=%g=u!j+ud#!HsbS!z6|X zmPtUtkBpmS_?hYl)E~vE9MtfKK@yV*@qtI3uyYvzJ0oUDvn1u`=S*&_lb`&zTVb+7 zH!E{yUh-taGMUK^oq?Mhs#91u|C+(VIGLx(Z}Nl&mdUqfC`|r0lWlU$L>0E&3bHiw zY))&s%Z_Z<=GT*6L+ydu!Oj6S9OM$9eVbz@_A?T%W%Iw8&-nOngkh%9MQeokP}A;a IzI~sV0jez+^Z)<= From aaf61ba48e21f9a97839c5609945ebe754b1b62a Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 27 Jun 2023 19:08:43 -0700 Subject: [PATCH 02/34] ci: ignore return code of diff diff returns a 1 error code if diffs are found which halts the script, but we don't consider this an error, we're just interested in the information --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 18ad2d7a..692c01c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,8 +71,8 @@ jobs: curl -fLSs -o ISLEPROGRESS-OLD.TXT https://github.com/isledecomp/isle/releases/download/continuous/ISLEPROGRESS.TXT curl -fLSs -o LEGO1PROGRESS-OLD.TXT https://github.com/isledecomp/isle/releases/download/continuous/LEGO1PROGRESS.TXT - diff -u ISLEPROGRESS-OLD.TXT ISLEPROGRESS.TXT - diff -u LEGO1PROGRESS-OLD.TXT LEGO1PROGRESS.TXT + diff -u ISLEPROGRESS-OLD.TXT ISLEPROGRESS.TXT || true + diff -u LEGO1PROGRESS-OLD.TXT LEGO1PROGRESS.TXT || true - name: Upload Artifact uses: actions/upload-artifact@master From 8e6e2a39622ab4f919bdaf9c4b4b934f19cb78e7 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 27 Jun 2023 19:46:04 -0700 Subject: [PATCH 03/34] reccmp: fix SVGs on light backgrounds --- tools/reccmp/template.svg | 65 ++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/tools/reccmp/template.svg b/tools/reccmp/template.svg index 1cded1e3..bd36e9b2 100644 --- a/tools/reccmp/template.svg +++ b/tools/reccmp/template.svg @@ -25,31 +25,25 @@ inkscape:deskcolor="#505050" showgrid="false" inkscape:zoom="1.6046875" - inkscape:cx="239.29893" - inkscape:cy="219.98053" + inkscape:cx="158.90944" + inkscape:cy="220.6037" inkscape:window-width="2560" inkscape:window-height="1379" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="svg5" /> - {name}{percent}{percent}Implemented: {implemented}Accuracy: {accuracy} From 8da62cc596f51180a0cf620e43624e3bdf35d742 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 27 Jun 2023 19:55:17 -0700 Subject: [PATCH 04/34] ci: convert to 512px png These might scale down better, the ones in the readme seem really blurry --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 692c01c6..54722601 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -94,8 +94,8 @@ jobs: INKSCAPE_DIR=inkscape-1.2.2_2022-12-09_732a01da63-x64 curl -fLOSs https://inkscape.org/gallery/item/37364/$INKSCAPE_DIR.7z 7z x $INKSCAPE_DIR.7z - $INKSCAPE_DIR/bin/inkscape -w 1024 ISLEPROGRESS.SVG -o ISLEPROGRESS.PNG - $INKSCAPE_DIR/bin/inkscape -w 1024 LEGO1PROGRESS.SVG -o LEGO1PROGRESS.PNG + $INKSCAPE_DIR/bin/inkscape -w 512 ISLEPROGRESS.SVG -o ISLEPROGRESS.PNG + $INKSCAPE_DIR/bin/inkscape -w 512 LEGO1PROGRESS.SVG -o LEGO1PROGRESS.PNG curl -fLOSs https://raw.githubusercontent.com/probonopd/uploadtool/master/upload.sh ./upload.sh \ From 2d9af630ba63e3da2302d19164092138e2295cc0 Mon Sep 17 00:00:00 2001 From: MS Date: Tue, 27 Jun 2023 22:57:30 -0400 Subject: [PATCH 05/34] lego1: Two more operators for MxString (#53) Followed the hint from @madebr in #31 that the next function in MxString was operator+. The one after that is operator+= and both are at 100%. Squashed commits: * Removed unnecessary consts * Replaced malloc/free with new/delete, which solved swapped regs in operator= * Use delete[] when freeing char* m_data --- LEGO1/mxstring.cpp | 55 ++++++++++++++++++++++++++++++++++++---------- LEGO1/mxstring.h | 4 +++- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/LEGO1/mxstring.cpp b/LEGO1/mxstring.cpp index 09130a39..e2f24cab 100644 --- a/LEGO1/mxstring.cpp +++ b/LEGO1/mxstring.cpp @@ -6,7 +6,7 @@ MxString::MxString() { // Set string to one char in length and set that char to null terminator - this->m_data = (char *)malloc(1); + this->m_data = new char[1]; this->m_data[0] = 0; this->m_length = 0; } @@ -15,7 +15,7 @@ MxString::MxString() MxString::MxString(const MxString &str) { this->m_length = str.m_length; - this->m_data = (char *)malloc(this->m_length + 1); + this->m_data = new char[this->m_length + 1]; strcpy(this->m_data, str.m_data); } @@ -24,10 +24,10 @@ MxString::MxString(const char *str) { if (str) { this->m_length = strlen(str); - this->m_data = (char *)malloc(this->m_length + 1); + this->m_data = new char[this->m_length + 1]; strcpy(this->m_data, str); } else { - this->m_data = (char *)malloc(1); + this->m_data = new char[1]; this->m_data[0] = 0; this->m_length = 0; } @@ -36,7 +36,7 @@ MxString::MxString(const char *str) // OFFSET: LEGO1 0x100ae420 MxString::~MxString() { - free(this->m_data); + delete[] this->m_data; } // OFFSET: LEGO1 0x100ae490 @@ -52,30 +52,63 @@ void MxString::ToLowerCase() } // OFFSET: LEGO1 0x100ae4b0 -const MxString &MxString::operator=(MxString *param) +MxString &MxString::operator=(MxString *param) { if (this->m_data != param->m_data) { - free(this->m_data); + delete[] this->m_data; this->m_length = param->m_length; - this->m_data = (char *)malloc(this->m_length + 1); + this->m_data = new char[this->m_length + 1]; strcpy(this->m_data, param->m_data); } return *this; } -// TODO: this *mostly* matches, again weird with the comparison // OFFSET: LEGO1 0x100ae510 const MxString &MxString::operator=(const char *param) { if (this->m_data != param) { - free(this->m_data); + delete[] this->m_data; this->m_length = strlen(param); - this->m_data = (char *)malloc(this->m_length + 1); + this->m_data = new char[this->m_length + 1]; strcpy(this->m_data, param); } return *this; } + +// Return type is intentionally just MxString, not MxString&. +// This forces MSVC to add $ReturnUdt$ to the stack for 100% match. +// OFFSET: LEGO1 0x100ae580 +MxString MxString::operator+(const char *str) +{ + // MxString constructor allocates 1 byte for m_data, so free that first + MxString tmp; + delete[] tmp.m_data; + + tmp.m_length = strlen(str) + this->m_length; + tmp.m_data = new char[tmp.m_length + 1]; + + strcpy(tmp.m_data, this->m_data); + strcpy(tmp.m_data + this->m_length, str); + + return MxString(tmp); +} + +// OFFSET: LEGO1 0x100ae690 +MxString& MxString::operator+=(const char *str) +{ + int newlen = this->m_length + strlen(str); + + char *tmp = new char[newlen + 1]; + strcpy(tmp, this->m_data); + strcpy(tmp + this->m_length, str); + + delete[] this->m_data; + this->m_length = newlen; + this->m_data = tmp; + + return *this; +} diff --git a/LEGO1/mxstring.h b/LEGO1/mxstring.h index a9a25ba1..03da0ec4 100644 --- a/LEGO1/mxstring.h +++ b/LEGO1/mxstring.h @@ -14,7 +14,9 @@ class MxString : public MxCore MxString(const char *); void ToUpperCase(); void ToLowerCase(); - const MxString &operator=(MxString *); + MxString& operator=(MxString *); + MxString operator+(const char *); + MxString& operator+=(const char *); inline const char *GetData() const { return m_data; } From 4d200bb19367155e2e33cc0d9fc2b4627735bba9 Mon Sep 17 00:00:00 2001 From: MattKC <34096995+itsmattkc@users.noreply.github.com> Date: Thu, 29 Jun 2023 00:49:57 -0700 Subject: [PATCH 06/34] Update CONTRIBUTING.md --- CONTRIBUTING.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2c6519ce..5633e7c6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,13 +6,21 @@ Generally, decompilation is a fairly advanced skill. If you aren't already famil ## Ghidra Server -For documenting the original binaries and generating pseudocode that we decompile with, we primarily use [Ghidra](https://ghidra-sre.org/) (it's free and open source). To help with collaboration, we have a shared Ghidra repository with all of our current work. You are free to check it out and mess around with it locally, however to prevent sabotage, you will need to request permission before you can push back to the server (ask in the Matrix room). +For documenting the original binaries and generating pseudocode that we decompile with, we primarily use [Ghidra](https://ghidra-sre.org/) (it's free and open source). To help with collaboration, we have a shared Ghidra repository with all of our current work. You are free to check it out and mess around with it locally, however to prevent sabotage, you will need to request permission before you can push your changes back to the server (ask in the Matrix room). To access the Ghidra repository, use the following details: - Address: `server.mattkc.com` - Port: `13100` +## General Guidelines + +If you have contributions, feel free to create a pull request! Someone will review and merge it (or provide feedback) as soon as possible. + +Please keep your pull requests small and understandable; you may be able to shoot ahead and make a lot of progress in a short amount of time, but this is a collaborative project, so you must allow others to catch up and follow along. Large pull requests become significantly more unwieldy to review, and as such make it exponentially more likely for a mistake or error to go undetected. They also make it harder to merge other pull requests because the more files you modify, the more likely it is for a merge conflict to occur. A general guideline is to keep submissions limited to one class at a time. Sometimes two or more classes may be too interlinked for this to be feasible, so this is not a hard rule, however if your PR is starting to modify more than 10 or so files, it's probably getting too big. + +This repository currently has only one goal: accuracy to the original executables. We are byte/instruction matching as much as possible, which means the priority is making the original compiler (MSVC 4.20) produce code that matches the original game. As such, modernizations and bug fixes will probably be rejected for the time being. + ## Code Style In general, we're not exhaustively strict about coding style, but there are some preferable guidelines to follow that have been adopted from what we know about the original codebase: @@ -23,10 +31,6 @@ In general, we're not exhaustively strict about coding style, but there are some - `g_camelCase` for global variables. - `p_camelCase` for function parameters. -## Kinds of Contributions - -This repository has only one goal: accuracy to the original executables. As such, we are not likely to accept pull requests that attempt to modernize the code, or improve compatibility in a newer compiler that ends up reducing compatibility in MSVC 4.20. Essentially, accuracy is king, everything else is secondary. For modernizations and enhancements, it's recommended to create a fork downstream from this one instead. - ## Questions? For any further questions, feel free to ask in either the [Matrix chatroom](https://matrix.to/#/#isledecomp:matrix.org) or on the [forum](https://forum.mattkc.com/viewforum.php?f=1). From 07912eb05ac111d799e5607902a1007e9e2c79f9 Mon Sep 17 00:00:00 2001 From: Cydra Date: Thu, 29 Jun 2023 10:10:08 +0200 Subject: [PATCH 07/34] Class layout for LEGO1 classes (#43) * Stubbed a bunch of classes and annotated them for later use. Heavily wip and more of pseudocode right now. * Converted pseudocode into real code! * Created a bunch more classes and added more information to exisiting ones Did not error check, this was pushed just for reference * More classes and implementation details. Still not checked for any errors * Fixed code and decided on a way to handle virtual table stubs * Some additional fixes * More smaller fixes * Added classes to project and made it compile * Fixed function adresses that caused the python script to fail * More classes and virtual function resolves. Builds and compares fine. * Again more classes and virtual function resolves. Builds and compares fine. * No clue, I guess forced update for line endings * Finished up some work, compiles fine. All functions are STUB annotated to not pollute reccmp.py output. * line ending change * rename GetClassName/IsClass Mirroring recent changes from master * further conform to current master * update project * cleanup * project only updates when you close msdev --------- Co-authored-by: Cydra Co-authored-by: itsmattkc <34096995+itsmattkc@users.noreply.github.com> --- ISLE/{isle.cpp => isleapp.cpp} | 2 +- ISLE/{isle.h => isleapp.h} | 8 +- LEGO1/act1state.cpp | 8 + LEGO1/act1state.h | 27 + LEGO1/act2brick.cpp | 29 + LEGO1/act2brick.h | 32 + LEGO1/act2policestation.cpp | 9 + LEGO1/act2policestation.h | 27 + LEGO1/act3.cpp | 13 + LEGO1/act3.h | 31 + LEGO1/act3actor.h | 18 + LEGO1/act3shark.cpp | 1 + LEGO1/act3shark.h | 18 + LEGO1/act3state.cpp | 7 + LEGO1/act3state.h | 37 + LEGO1/ambulance.cpp | 7 + LEGO1/ambulance.h | 28 + LEGO1/ambulancemissionstate.cpp | 7 + LEGO1/ambulancemissionstate.h | 29 + LEGO1/animstate.cpp | 13 + LEGO1/animstate.h | 29 + LEGO1/beachhouseentity.cpp | 9 + LEGO1/beachhouseentity.h | 27 + LEGO1/bike.cpp | 8 + LEGO1/bike.h | 29 + LEGO1/buildingentity.cpp | 13 + LEGO1/buildingentity.h | 28 + LEGO1/bumpbouy.cpp | 1 + LEGO1/bumpbouy.h | 25 + LEGO1/carrace.cpp | 7 + LEGO1/carrace.h | 27 + LEGO1/carracestate.h | 25 + LEGO1/doors.h | 26 + LEGO1/dunebuggy.cpp | 7 + LEGO1/dunebuggy.h | 28 + LEGO1/elevatorbottom.cpp | 21 + LEGO1/elevatorbottom.h | 30 + LEGO1/gasstation.cpp | 29 + LEGO1/gasstation.h | 33 + LEGO1/gasstationentity.cpp | 1 + LEGO1/gasstationentity.h | 25 + LEGO1/gasstationstate.cpp | 7 + LEGO1/gasstationstate.h | 28 + LEGO1/helicopter.cpp | 13 + LEGO1/helicopter.h | 29 + LEGO1/helicopterstate.cpp | 1 + LEGO1/helicopterstate.h | 25 + LEGO1/historybook.cpp | 21 + LEGO1/historybook.h | 30 + LEGO1/hospital.cpp | 21 + LEGO1/hospital.h | 31 + LEGO1/hospitalentity.cpp | 1 + LEGO1/hospitalentity.h | 26 + LEGO1/hospitalstate.cpp | 7 + LEGO1/hospitalstate.h | 28 + LEGO1/infocenter.cpp | 29 + LEGO1/infocenter.h | 32 + LEGO1/infocenterdoor.cpp | 21 + LEGO1/infocenterdoor.h | 31 + LEGO1/infocenterentity.cpp | 1 + LEGO1/infocenterentity.h | 26 + LEGO1/infocenterstate.cpp | 14 + LEGO1/infocenterstate.h | 28 + LEGO1/isle.cpp | 7 + LEGO1/isle.h | 28 + LEGO1/isleactor.cpp | 1 + LEGO1/isleactor.h | 24 + LEGO1/islepathactor.cpp | 1 + LEGO1/islepathactor.h | 25 + LEGO1/jetski.cpp | 7 + LEGO1/jetski.h | 29 + LEGO1/jetskirace.cpp | 1 + LEGO1/jetskirace.h | 26 + LEGO1/jetskiracestate.h | 26 + LEGO1/jukebox.cpp | 7 + LEGO1/jukebox.h | 28 + LEGO1/jukeboxentity.cpp | 13 + LEGO1/jukeboxentity.h | 29 + LEGO1/jukeboxstate.cpp | 1 + LEGO1/jukeboxstate.h | 26 + LEGO1/lego3dwavepresenter.h | 25 + LEGO1/legoact2state.cpp | 1 + LEGO1/legoact2state.h | 26 + LEGO1/legoactioncontrolpresenter.cpp | 1 + LEGO1/legoactioncontrolpresenter.h | 25 + LEGO1/legoactor.h | 25 + LEGO1/legoactorpresenter.h | 25 + LEGO1/legoanimactor.cpp | 1 + LEGO1/legoanimactor.h | 11 + LEGO1/legoanimationmanager.cpp | 34 + LEGO1/legoanimationmanager.h | 29 +- LEGO1/legoanimmmpresenter.cpp | 7 + LEGO1/legoanimmmpresenter.h | 28 + LEGO1/legoanimpresenter.cpp | 13 + LEGO1/legoanimpresenter.h | 30 + LEGO1/legobuildingmanager.cpp | 17 + LEGO1/legobuildingmanager.h | 20 +- LEGO1/legocachesound.cpp | 19 + LEGO1/legocachesound.h | 31 + LEGO1/legocameracontroller.cpp | 13 + LEGO1/legocameracontroller.h | 29 + LEGO1/legocarbuild.cpp | 29 + LEGO1/legocarbuild.h | 31 + LEGO1/legocarbuildanimpresenter.cpp | 13 + LEGO1/legocarbuildanimpresenter.h | 28 + LEGO1/legocarraceactor.h | 24 + LEGO1/legocontrolmanager.cpp | 21 + LEGO1/legocontrolmanager.h | 30 + LEGO1/legoentity.cpp | 21 + LEGO1/legoentity.h | 31 +- LEGO1/legoentitypresenter.cpp | 19 + LEGO1/legoentitypresenter.h | 32 + LEGO1/legoextraactor.h | 24 + LEGO1/legoflctexturepresenter.cpp | 7 + LEGO1/legoflctexturepresenter.h | 22 + LEGO1/legohideanimpresenter.cpp | 12 + LEGO1/legohideanimpresenter.h | 31 + LEGO1/legoinputmanager.cpp | 22 + LEGO1/legoinputmanager.h | 7 + LEGO1/legojetski.cpp | 1 + LEGO1/legojetski.h | 26 + LEGO1/legojetskiraceactor.h | 24 + LEGO1/legoloadcachesoundpresenter.cpp | 19 + LEGO1/legoloadcachesoundpresenter.h | 26 + LEGO1/legolocomotionanimpresenter.cpp | 13 + LEGO1/legolocomotionanimpresenter.h | 30 + LEGO1/legoloopinganimpresenter.h | 25 + LEGO1/legomodelpresenter.h | 19 +- LEGO1/legonavcontroller.h | 17 +- LEGO1/legoomni.cpp | 18 + LEGO1/legoomni.h | 30 +- LEGO1/legopalettepresenter.cpp | 19 + LEGO1/legopalettepresenter.h | 33 + LEGO1/legopartpresenter.h | 17 +- LEGO1/legopathactor.cpp | 13 + LEGO1/legopathactor.h | 30 + LEGO1/legopathcontroller.cpp | 20 + LEGO1/legopathcontroller.h | 31 + LEGO1/legopathpresenter.cpp | 7 + LEGO1/legopathpresenter.h | 29 + LEGO1/legophonemepresenter.cpp | 19 + LEGO1/legophonemepresenter.h | 26 + LEGO1/legoplantmanager.cpp | 27 + LEGO1/legoplantmanager.h | 28 + LEGO1/legorace.cpp | 21 + LEGO1/legorace.h | 29 + LEGO1/legoraceactor.h | 25 + LEGO1/legosoundmanager.cpp | 20 + LEGO1/legosoundmanager.h | 20 + LEGO1/legostate.cpp | 6 + LEGO1/legostate.h | 27 + LEGO1/legotexturepresenter.cpp | 7 + LEGO1/legotexturepresenter.h | 28 + LEGO1/legoutil.h | 4 +- LEGO1/legovideomanager.cpp | 39 + LEGO1/legovideomanager.h | 5 + LEGO1/legoworld.cpp | 13 + LEGO1/legoworld.h | 21 +- LEGO1/legoworldpresenter.cpp | 19 + LEGO1/legoworldpresenter.h | 23 +- LEGO1/motorcycle.cpp | 7 + LEGO1/motorcycle.h | 28 + LEGO1/mxatomid.cpp | 8 +- LEGO1/mxatomid.h | 2 +- LEGO1/mxaudiopresenter.cpp | 1 + LEGO1/mxaudiopresenter.h | 24 + LEGO1/mxautolocker.h | 10 +- LEGO1/mxbackgroundaudiomanager.cpp | 19 + LEGO1/mxbackgroundaudiomanager.h | 22 +- LEGO1/mxcompositemediapresenter.cpp | 7 + LEGO1/mxcompositemediapresenter.h | 28 + LEGO1/mxcompositepresenter.cpp | 13 + LEGO1/mxcompositepresenter.h | 29 + LEGO1/mxcontrolpresenter.cpp | 7 + LEGO1/mxcontrolpresenter.h | 29 + LEGO1/mxcore.h | 13 +- LEGO1/mxdiskstreamcontroller.cpp | 21 + LEGO1/mxdiskstreamcontroller.h | 34 + LEGO1/mxdiskstreamprovider.cpp | 13 + LEGO1/mxdiskstreamprovider.h | 28 + LEGO1/mxdsaction.cpp | 13 + LEGO1/mxdsaction.h | 15 + LEGO1/mxdsanim.cpp | 13 + LEGO1/mxdsanim.h | 29 + LEGO1/mxdschunk.cpp | 13 + LEGO1/mxdschunk.h | 26 + LEGO1/mxdsevent.cpp | 13 + LEGO1/mxdsevent.h | 26 + LEGO1/mxdsfile.h | 33 +- LEGO1/mxdsmediaaction.cpp | 13 + LEGO1/mxdsmediaaction.h | 29 + LEGO1/mxdsmultiaction.cpp | 13 + LEGO1/mxdsmultiaction.h | 28 + LEGO1/mxdsobject.cpp | 6 + LEGO1/mxdsobject.h | 16 + LEGO1/mxdsobjectaction.cpp | 13 + LEGO1/mxdsobjectaction.h | 28 + LEGO1/mxdsparallelaction.cpp | 13 + LEGO1/mxdsparallelaction.h | 29 + LEGO1/mxdsselectaction.cpp | 13 + LEGO1/mxdsselectaction.h | 29 + LEGO1/mxdsserialaction.cpp | 13 + LEGO1/mxdsserialaction.h | 28 + LEGO1/mxdssound.cpp | 13 + LEGO1/mxdssound.h | 29 + LEGO1/mxdssource.h | 16 +- LEGO1/mxdsstill.cpp | 13 + LEGO1/mxdsstill.h | 28 + LEGO1/mxdssubscriber.cpp | 13 + LEGO1/mxdssubscriber.h | 28 + LEGO1/mxentity.cpp | 13 + LEGO1/mxentity.h | 30 + LEGO1/mxeventmanager.cpp | 13 + LEGO1/mxeventmanager.h | 11 +- LEGO1/mxeventpresenter.cpp | 19 + LEGO1/mxeventpresenter.h | 32 + LEGO1/mxflcpresenter.cpp | 13 + LEGO1/mxflcpresenter.h | 28 + LEGO1/mxloopingflcpresenter.cpp | 19 + LEGO1/mxloopingflcpresenter.h | 25 + LEGO1/mxloopingmidipresenter.h | 25 + LEGO1/mxloopingsmkpresenter.cpp | 19 + LEGO1/mxloopingsmkpresenter.h | 25 + LEGO1/mxmediapresenter.cpp | 14 + LEGO1/mxmediapresenter.h | 35 + LEGO1/mxmidipresenter.h | 11 + LEGO1/mxmusicmanager.h | 6 +- LEGO1/mxmusicpresenter.cpp | 7 + LEGO1/mxmusicpresenter.h | 13 + LEGO1/mxnextactiondatastart.h | 12 + LEGO1/mxnotificationmanager.cpp | 15 + LEGO1/mxnotificationmanager.h | 12 +- LEGO1/mxobjectfactory.h | 5 +- LEGO1/mxomni.h | 3 +- LEGO1/mxpalette.h | 4 +- LEGO1/mxpresenter.cpp | 134 + LEGO1/mxpresenter.h | 73 +- LEGO1/mxramstreamcontroller.h | 12 + LEGO1/mxramstreamprovider.h | 12 + LEGO1/mxresult.h | 8 - LEGO1/mxsmkpresenter.cpp | 13 + LEGO1/mxsmkpresenter.h | 18 + LEGO1/mxsoundmanager.cpp | 13 + LEGO1/mxsoundmanager.h | 10 +- LEGO1/mxsoundpresenter.cpp | 1 + LEGO1/mxsoundpresenter.h | 25 + LEGO1/mxstillpresenter.cpp | 1 + LEGO1/mxstillpresenter.h | 13 + LEGO1/mxstreamchunk.h | 12 + LEGO1/mxstreamcontroller.h | 18 +- LEGO1/mxstreamer.cpp | 23 + LEGO1/mxstreamer.h | 9 +- LEGO1/mxstreamprovider.h | 12 + LEGO1/mxstring.h | 1 + LEGO1/mxticklemanager.h | 1 + LEGO1/mxtimer.h | 2 + LEGO1/mxtransitionmanager.cpp | 21 + LEGO1/mxtransitionmanager.h | 9 +- LEGO1/mxtypes.h | 10 +- LEGO1/mxunknown100dc6b0.cpp | 2 +- LEGO1/mxunknown100dc6b0.h | 3 +- LEGO1/mxvariabletable.h | 2 + LEGO1/mxvideomanager.cpp | 14 + LEGO1/mxvideomanager.h | 8 +- LEGO1/mxvideopresenter.cpp | 1 + LEGO1/mxvideopresenter.h | 23 + LEGO1/mxwavepresenter.cpp | 7 + LEGO1/mxwavepresenter.h | 16 + LEGO1/pizza.cpp | 13 + LEGO1/pizza.h | 16 + LEGO1/pizzamissionstate.cpp | 1 + LEGO1/pizzamissionstate.h | 25 + LEGO1/pizzeria.cpp | 1 + LEGO1/pizzeria.h | 13 + LEGO1/pizzeriastate.cpp | 7 + LEGO1/pizzeriastate.h | 15 + LEGO1/police.cpp | 21 + LEGO1/police.h | 19 + LEGO1/policeentity.cpp | 1 + LEGO1/policeentity.h | 13 + LEGO1/policestate.cpp | 7 + LEGO1/policestate.h | 27 + LEGO1/racecar.cpp | 13 + LEGO1/racecar.h | 15 + LEGO1/racestandsentity.cpp | 1 + LEGO1/racestandsentity.h | 12 + LEGO1/racestate.cpp | 7 + LEGO1/racestate.h | 28 + LEGO1/radio.cpp | 7 + LEGO1/radio.h | 14 + LEGO1/radiostate.cpp | 7 + LEGO1/radiostate.h | 28 + LEGO1/registrationbook.cpp | 21 + LEGO1/registrationbook.h | 18 + LEGO1/score.cpp | 21 + LEGO1/score.h | 18 + LEGO1/scorestate.cpp | 1 + LEGO1/scorestate.h | 26 + LEGO1/skateboard.cpp | 7 + LEGO1/skateboard.h | 15 + LEGO1/towtrack.cpp | 7 + LEGO1/towtrack.h | 16 + LEGO1/towtrackmissionstate.cpp | 7 + LEGO1/towtrackmissionstate.h | 28 + isle.mak | 3384 ++++++++++++++++++++++++- isle.mdp | Bin 49664 -> 78336 bytes tools/reccmp/reccmp.py | 2 +- 307 files changed, 8764 insertions(+), 165 deletions(-) rename ISLE/{isle.cpp => isleapp.cpp} (99%) rename ISLE/{isle.h => isleapp.h} (94%) create mode 100644 LEGO1/act1state.cpp create mode 100644 LEGO1/act1state.h create mode 100644 LEGO1/act2brick.cpp create mode 100644 LEGO1/act2brick.h create mode 100644 LEGO1/act2policestation.cpp create mode 100644 LEGO1/act2policestation.h create mode 100644 LEGO1/act3.cpp create mode 100644 LEGO1/act3.h create mode 100644 LEGO1/act3actor.h create mode 100644 LEGO1/act3shark.cpp create mode 100644 LEGO1/act3shark.h create mode 100644 LEGO1/act3state.cpp create mode 100644 LEGO1/act3state.h create mode 100644 LEGO1/ambulance.cpp create mode 100644 LEGO1/ambulance.h create mode 100644 LEGO1/ambulancemissionstate.cpp create mode 100644 LEGO1/ambulancemissionstate.h create mode 100644 LEGO1/animstate.cpp create mode 100644 LEGO1/animstate.h create mode 100644 LEGO1/beachhouseentity.cpp create mode 100644 LEGO1/beachhouseentity.h create mode 100644 LEGO1/bike.cpp create mode 100644 LEGO1/bike.h create mode 100644 LEGO1/buildingentity.cpp create mode 100644 LEGO1/buildingentity.h create mode 100644 LEGO1/bumpbouy.cpp create mode 100644 LEGO1/bumpbouy.h create mode 100644 LEGO1/carrace.cpp create mode 100644 LEGO1/carrace.h create mode 100644 LEGO1/carracestate.h create mode 100644 LEGO1/doors.h create mode 100644 LEGO1/dunebuggy.cpp create mode 100644 LEGO1/dunebuggy.h create mode 100644 LEGO1/elevatorbottom.cpp create mode 100644 LEGO1/elevatorbottom.h create mode 100644 LEGO1/gasstation.cpp create mode 100644 LEGO1/gasstation.h create mode 100644 LEGO1/gasstationentity.cpp create mode 100644 LEGO1/gasstationentity.h create mode 100644 LEGO1/gasstationstate.cpp create mode 100644 LEGO1/gasstationstate.h create mode 100644 LEGO1/helicopter.cpp create mode 100644 LEGO1/helicopter.h create mode 100644 LEGO1/helicopterstate.cpp create mode 100644 LEGO1/helicopterstate.h create mode 100644 LEGO1/historybook.cpp create mode 100644 LEGO1/historybook.h create mode 100644 LEGO1/hospital.cpp create mode 100644 LEGO1/hospital.h create mode 100644 LEGO1/hospitalentity.cpp create mode 100644 LEGO1/hospitalentity.h create mode 100644 LEGO1/hospitalstate.cpp create mode 100644 LEGO1/hospitalstate.h create mode 100644 LEGO1/infocenter.cpp create mode 100644 LEGO1/infocenter.h create mode 100644 LEGO1/infocenterdoor.cpp create mode 100644 LEGO1/infocenterdoor.h create mode 100644 LEGO1/infocenterentity.cpp create mode 100644 LEGO1/infocenterentity.h create mode 100644 LEGO1/infocenterstate.cpp create mode 100644 LEGO1/infocenterstate.h create mode 100644 LEGO1/isle.cpp create mode 100644 LEGO1/isle.h create mode 100644 LEGO1/isleactor.cpp create mode 100644 LEGO1/isleactor.h create mode 100644 LEGO1/islepathactor.cpp create mode 100644 LEGO1/islepathactor.h create mode 100644 LEGO1/jetski.cpp create mode 100644 LEGO1/jetski.h create mode 100644 LEGO1/jetskirace.cpp create mode 100644 LEGO1/jetskirace.h create mode 100644 LEGO1/jetskiracestate.h create mode 100644 LEGO1/jukebox.cpp create mode 100644 LEGO1/jukebox.h create mode 100644 LEGO1/jukeboxentity.cpp create mode 100644 LEGO1/jukeboxentity.h create mode 100644 LEGO1/jukeboxstate.cpp create mode 100644 LEGO1/jukeboxstate.h create mode 100644 LEGO1/lego3dwavepresenter.h create mode 100644 LEGO1/legoact2state.cpp create mode 100644 LEGO1/legoact2state.h create mode 100644 LEGO1/legoactioncontrolpresenter.cpp create mode 100644 LEGO1/legoactioncontrolpresenter.h create mode 100644 LEGO1/legoactor.h create mode 100644 LEGO1/legoactorpresenter.h create mode 100644 LEGO1/legoanimactor.cpp create mode 100644 LEGO1/legoanimactor.h create mode 100644 LEGO1/legoanimationmanager.cpp create mode 100644 LEGO1/legoanimmmpresenter.cpp create mode 100644 LEGO1/legoanimmmpresenter.h create mode 100644 LEGO1/legoanimpresenter.cpp create mode 100644 LEGO1/legoanimpresenter.h create mode 100644 LEGO1/legobuildingmanager.cpp create mode 100644 LEGO1/legocachesound.cpp create mode 100644 LEGO1/legocachesound.h create mode 100644 LEGO1/legocameracontroller.cpp create mode 100644 LEGO1/legocameracontroller.h create mode 100644 LEGO1/legocarbuild.cpp create mode 100644 LEGO1/legocarbuild.h create mode 100644 LEGO1/legocarbuildanimpresenter.cpp create mode 100644 LEGO1/legocarbuildanimpresenter.h create mode 100644 LEGO1/legocarraceactor.h create mode 100644 LEGO1/legocontrolmanager.cpp create mode 100644 LEGO1/legocontrolmanager.h create mode 100644 LEGO1/legoentity.cpp create mode 100644 LEGO1/legoentitypresenter.cpp create mode 100644 LEGO1/legoentitypresenter.h create mode 100644 LEGO1/legoextraactor.h create mode 100644 LEGO1/legoflctexturepresenter.cpp create mode 100644 LEGO1/legoflctexturepresenter.h create mode 100644 LEGO1/legohideanimpresenter.cpp create mode 100644 LEGO1/legohideanimpresenter.h create mode 100644 LEGO1/legoinputmanager.cpp create mode 100644 LEGO1/legojetski.cpp create mode 100644 LEGO1/legojetski.h create mode 100644 LEGO1/legojetskiraceactor.h create mode 100644 LEGO1/legoloadcachesoundpresenter.cpp create mode 100644 LEGO1/legoloadcachesoundpresenter.h create mode 100644 LEGO1/legolocomotionanimpresenter.cpp create mode 100644 LEGO1/legolocomotionanimpresenter.h create mode 100644 LEGO1/legoloopinganimpresenter.h create mode 100644 LEGO1/legopalettepresenter.cpp create mode 100644 LEGO1/legopalettepresenter.h create mode 100644 LEGO1/legopathactor.cpp create mode 100644 LEGO1/legopathactor.h create mode 100644 LEGO1/legopathcontroller.cpp create mode 100644 LEGO1/legopathcontroller.h create mode 100644 LEGO1/legopathpresenter.cpp create mode 100644 LEGO1/legopathpresenter.h create mode 100644 LEGO1/legophonemepresenter.cpp create mode 100644 LEGO1/legophonemepresenter.h create mode 100644 LEGO1/legoplantmanager.cpp create mode 100644 LEGO1/legoplantmanager.h create mode 100644 LEGO1/legorace.cpp create mode 100644 LEGO1/legorace.h create mode 100644 LEGO1/legoraceactor.h create mode 100644 LEGO1/legosoundmanager.cpp create mode 100644 LEGO1/legosoundmanager.h create mode 100644 LEGO1/legostate.cpp create mode 100644 LEGO1/legostate.h create mode 100644 LEGO1/legotexturepresenter.cpp create mode 100644 LEGO1/legotexturepresenter.h create mode 100644 LEGO1/legovideomanager.cpp create mode 100644 LEGO1/legoworld.cpp create mode 100644 LEGO1/legoworldpresenter.cpp create mode 100644 LEGO1/motorcycle.cpp create mode 100644 LEGO1/motorcycle.h create mode 100644 LEGO1/mxaudiopresenter.cpp create mode 100644 LEGO1/mxaudiopresenter.h create mode 100644 LEGO1/mxbackgroundaudiomanager.cpp create mode 100644 LEGO1/mxcompositemediapresenter.cpp create mode 100644 LEGO1/mxcompositemediapresenter.h create mode 100644 LEGO1/mxcompositepresenter.cpp create mode 100644 LEGO1/mxcompositepresenter.h create mode 100644 LEGO1/mxcontrolpresenter.cpp create mode 100644 LEGO1/mxcontrolpresenter.h create mode 100644 LEGO1/mxdiskstreamcontroller.cpp create mode 100644 LEGO1/mxdiskstreamcontroller.h create mode 100644 LEGO1/mxdiskstreamprovider.cpp create mode 100644 LEGO1/mxdiskstreamprovider.h create mode 100644 LEGO1/mxdsaction.cpp create mode 100644 LEGO1/mxdsanim.cpp create mode 100644 LEGO1/mxdsanim.h create mode 100644 LEGO1/mxdschunk.cpp create mode 100644 LEGO1/mxdschunk.h create mode 100644 LEGO1/mxdsevent.cpp create mode 100644 LEGO1/mxdsevent.h create mode 100644 LEGO1/mxdsmediaaction.cpp create mode 100644 LEGO1/mxdsmediaaction.h create mode 100644 LEGO1/mxdsmultiaction.cpp create mode 100644 LEGO1/mxdsmultiaction.h create mode 100644 LEGO1/mxdsobjectaction.cpp create mode 100644 LEGO1/mxdsobjectaction.h create mode 100644 LEGO1/mxdsparallelaction.cpp create mode 100644 LEGO1/mxdsparallelaction.h create mode 100644 LEGO1/mxdsselectaction.cpp create mode 100644 LEGO1/mxdsselectaction.h create mode 100644 LEGO1/mxdsserialaction.cpp create mode 100644 LEGO1/mxdsserialaction.h create mode 100644 LEGO1/mxdssound.cpp create mode 100644 LEGO1/mxdssound.h create mode 100644 LEGO1/mxdsstill.cpp create mode 100644 LEGO1/mxdsstill.h create mode 100644 LEGO1/mxdssubscriber.cpp create mode 100644 LEGO1/mxdssubscriber.h create mode 100644 LEGO1/mxentity.cpp create mode 100644 LEGO1/mxentity.h create mode 100644 LEGO1/mxeventmanager.cpp create mode 100644 LEGO1/mxeventpresenter.cpp create mode 100644 LEGO1/mxeventpresenter.h create mode 100644 LEGO1/mxflcpresenter.cpp create mode 100644 LEGO1/mxflcpresenter.h create mode 100644 LEGO1/mxloopingflcpresenter.cpp create mode 100644 LEGO1/mxloopingflcpresenter.h create mode 100644 LEGO1/mxloopingmidipresenter.h create mode 100644 LEGO1/mxloopingsmkpresenter.cpp create mode 100644 LEGO1/mxloopingsmkpresenter.h create mode 100644 LEGO1/mxmediapresenter.cpp create mode 100644 LEGO1/mxmediapresenter.h create mode 100644 LEGO1/mxmidipresenter.h create mode 100644 LEGO1/mxmusicpresenter.cpp create mode 100644 LEGO1/mxmusicpresenter.h create mode 100644 LEGO1/mxnextactiondatastart.h create mode 100644 LEGO1/mxnotificationmanager.cpp create mode 100644 LEGO1/mxpresenter.cpp create mode 100644 LEGO1/mxramstreamcontroller.h create mode 100644 LEGO1/mxramstreamprovider.h delete mode 100644 LEGO1/mxresult.h create mode 100644 LEGO1/mxsmkpresenter.cpp create mode 100644 LEGO1/mxsmkpresenter.h create mode 100644 LEGO1/mxsoundmanager.cpp create mode 100644 LEGO1/mxsoundpresenter.cpp create mode 100644 LEGO1/mxsoundpresenter.h create mode 100644 LEGO1/mxstillpresenter.cpp create mode 100644 LEGO1/mxstillpresenter.h create mode 100644 LEGO1/mxstreamchunk.h create mode 100644 LEGO1/mxstreamer.cpp create mode 100644 LEGO1/mxstreamprovider.h create mode 100644 LEGO1/mxtransitionmanager.cpp create mode 100644 LEGO1/mxvideopresenter.cpp create mode 100644 LEGO1/mxvideopresenter.h create mode 100644 LEGO1/mxwavepresenter.cpp create mode 100644 LEGO1/mxwavepresenter.h create mode 100644 LEGO1/pizza.cpp create mode 100644 LEGO1/pizza.h create mode 100644 LEGO1/pizzamissionstate.cpp create mode 100644 LEGO1/pizzamissionstate.h create mode 100644 LEGO1/pizzeria.cpp create mode 100644 LEGO1/pizzeria.h create mode 100644 LEGO1/pizzeriastate.cpp create mode 100644 LEGO1/pizzeriastate.h create mode 100644 LEGO1/police.cpp create mode 100644 LEGO1/police.h create mode 100644 LEGO1/policeentity.cpp create mode 100644 LEGO1/policeentity.h create mode 100644 LEGO1/policestate.cpp create mode 100644 LEGO1/policestate.h create mode 100644 LEGO1/racecar.cpp create mode 100644 LEGO1/racecar.h create mode 100644 LEGO1/racestandsentity.cpp create mode 100644 LEGO1/racestandsentity.h create mode 100644 LEGO1/racestate.cpp create mode 100644 LEGO1/racestate.h create mode 100644 LEGO1/radio.cpp create mode 100644 LEGO1/radio.h create mode 100644 LEGO1/radiostate.cpp create mode 100644 LEGO1/radiostate.h create mode 100644 LEGO1/registrationbook.cpp create mode 100644 LEGO1/registrationbook.h create mode 100644 LEGO1/score.cpp create mode 100644 LEGO1/score.h create mode 100644 LEGO1/scorestate.cpp create mode 100644 LEGO1/scorestate.h create mode 100644 LEGO1/skateboard.cpp create mode 100644 LEGO1/skateboard.h create mode 100644 LEGO1/towtrack.cpp create mode 100644 LEGO1/towtrack.h create mode 100644 LEGO1/towtrackmissionstate.cpp create mode 100644 LEGO1/towtrackmissionstate.h diff --git a/ISLE/isle.cpp b/ISLE/isleapp.cpp similarity index 99% rename from ISLE/isle.cpp rename to ISLE/isleapp.cpp index 938de251..3697e816 100644 --- a/ISLE/isle.cpp +++ b/ISLE/isleapp.cpp @@ -1,4 +1,4 @@ -#include "isle.h" +#include "isleapp.h" #include "define.h" #include diff --git a/ISLE/isle.h b/ISLE/isleapp.h similarity index 94% rename from ISLE/isle.h rename to ISLE/isleapp.h index 7f01cf7d..d31c6f42 100644 --- a/ISLE/isle.h +++ b/ISLE/isleapp.h @@ -1,9 +1,9 @@ -#ifndef ISLE_H -#define ISLE_H +#ifndef ISLEAPP_H +#define ISLEAPP_H #include -#include "mxresult.h" +#include "mxtypes.h" #include "mxvideoparam.h" class IsleApp @@ -73,4 +73,4 @@ class IsleApp HCURSOR m_cursorCurrent; }; -#endif // ISLE_H +#endif // ISLEAPP_H diff --git a/LEGO1/act1state.cpp b/LEGO1/act1state.cpp new file mode 100644 index 00000000..556e6dbc --- /dev/null +++ b/LEGO1/act1state.cpp @@ -0,0 +1,8 @@ +#include "act1state.h" + +// OFFSET: LEGO1 0x100334b0 STUB +Act1State::Act1State() +{ + // TODO +} + diff --git a/LEGO1/act1state.h b/LEGO1/act1state.h new file mode 100644 index 00000000..edcb9e9d --- /dev/null +++ b/LEGO1/act1state.h @@ -0,0 +1,27 @@ +#ifndef ACT1STATE_H +#define ACT1STATE_H + +#include "legostate.h" + +// VTABLE 0x100d7028 +// SIZE 0x26c +class Act1State : public LegoState +{ +public: + Act1State(); + + // OFFSET: LEGO1 0x100338a0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0154 + return "Act1State"; + }; + + // OFFSET: LEGO1 0x100338b0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Act1State::ClassName()) || LegoState::IsA(name); + }; +}; + +#endif // ACT1STATE_H diff --git a/LEGO1/act2brick.cpp b/LEGO1/act2brick.cpp new file mode 100644 index 00000000..4bb2f3f9 --- /dev/null +++ b/LEGO1/act2brick.cpp @@ -0,0 +1,29 @@ +#include "act2brick.h" + +// OFFSET: LEGO1 0x1007a2b0 STUB +Act2Brick::Act2Brick() +{ + // TODO +} + +// OFFSET: LEGO1 0x1007a470 STUB +Act2Brick::~Act2Brick() +{ + // TODO +} + +// STUB OFFSET: LEGO1 0x1007a8c0 STUB +long Act2Brick::Notify(MxParam &p) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x1007a7f0 STUB +long Act2Brick::Tickle() +{ + // TODO + + return 0; +} diff --git a/LEGO1/act2brick.h b/LEGO1/act2brick.h new file mode 100644 index 00000000..d5703081 --- /dev/null +++ b/LEGO1/act2brick.h @@ -0,0 +1,32 @@ +#ifndef ACT2BRICK_H +#define ACT2BRICK_H + +#include "legopathactor.h" + +// VTABLE 0x100d9b60 +// SIZE 0x194 +class Act2Brick : public LegoPathActor +{ +public: + Act2Brick(); + virtual ~Act2Brick() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual long Tickle() override; // vtable+0x08 + + // OFFSET: LEGO1 0x1007a360 + inline virtual const char *ClassName() override // vtable+0x0c + { + // 0x100f0438 + return "Act2Brick"; + } + + // OFFSET: LEGO1 0x1007a370 + inline virtual MxBool IsA(const char *name) override // vtable+0x10 + { + return !strcmp(Act2Brick::ClassName(), name) || LegoEntity::IsA(name); + } + +}; + +#endif // ACT2BRICK_H diff --git a/LEGO1/act2policestation.cpp b/LEGO1/act2policestation.cpp new file mode 100644 index 00000000..14f69db4 --- /dev/null +++ b/LEGO1/act2policestation.cpp @@ -0,0 +1,9 @@ +#include "act2policestation.h" + +// OFFSET: LEGO1 0x1004e0e0 STUB +long Act2PoliceStation::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/act2policestation.h b/LEGO1/act2policestation.h new file mode 100644 index 00000000..e935e252 --- /dev/null +++ b/LEGO1/act2policestation.h @@ -0,0 +1,27 @@ +#ifndef ACT2POLICESTATION_H +#define ACT2POLICESTATION_H + +#include "legoentity.h" + +// VTABLE 0x100d53a8 +// SIZE 0x68 +class Act2PoliceStation : public LegoEntity +{ +public: + virtual long Notify(MxParam &p) override; // vtable+0x4 + + // OFFSET: LEGO1 0x1000e200 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f03fc + return "Act2PoliceStation"; + } + + // OFFSET: LEGO1 0x1000e210 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Act2PoliceStation::ClassName()) || LegoEntity::IsA(name); + } +}; + +#endif // ACT2POLICESTATION_H diff --git a/LEGO1/act3.cpp b/LEGO1/act3.cpp new file mode 100644 index 00000000..eca84fbf --- /dev/null +++ b/LEGO1/act3.cpp @@ -0,0 +1,13 @@ +#include "act3.h" + +// OFFSET: LEGO1 0x10072270 STUB +Act3::Act3() +{ + // TODO +} + +// OFFSET: LEGO1 0x100726a0 STUB +Act3::~Act3() +{ + // TODO +} diff --git a/LEGO1/act3.h b/LEGO1/act3.h new file mode 100644 index 00000000..d0cad28a --- /dev/null +++ b/LEGO1/act3.h @@ -0,0 +1,31 @@ +#ifndef ACT3_H +#define ACT3_H + +#include "legoworld.h" + +// VTABLE 0x100d9628 +// SIZE 0x4274 +class Act3 : public LegoWorld +{ +public: + Act3(); + + virtual ~Act3() override; // vtable+00 + + // OFFSET: LEGO1 0x10072510 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f013c + return "Act3"; + } + + // OFFSET: LEGO1 0x10072520 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Act3::ClassName()) || LegoWorld::IsA(name); + } + +}; + + +#endif // ACT3_H diff --git a/LEGO1/act3actor.h b/LEGO1/act3actor.h new file mode 100644 index 00000000..a88884a1 --- /dev/null +++ b/LEGO1/act3actor.h @@ -0,0 +1,18 @@ +#ifndef ACT3ACTOR_H +#define ACT3ACTOR_H + +// FIXME: Uncertain location. There are three vtables which eventually call this +// class' ClassName() function, but none of them call it directly. +class Act3Actor +{ +public: + // OFFSET: LEGO1 0x100431b0 + inline virtual const char *ClassName() override + { + // 0x100f03ac + return "Act3Actor"; + } + +}; + +#endif // ACT3ACTOR_H diff --git a/LEGO1/act3shark.cpp b/LEGO1/act3shark.cpp new file mode 100644 index 00000000..95e5a0e0 --- /dev/null +++ b/LEGO1/act3shark.cpp @@ -0,0 +1 @@ +#include "act3shark.h" diff --git a/LEGO1/act3shark.h b/LEGO1/act3shark.h new file mode 100644 index 00000000..6cbdbc09 --- /dev/null +++ b/LEGO1/act3shark.h @@ -0,0 +1,18 @@ +#ifndef ACT3SHARK_H +#define ACT3SHARK_H + +#include "legoanimactor.h" + +// VTABLE 0x100d7920 +class Act3Shark : public LegoAnimActor +{ +public: + // OFFSET: LEGO1 0x100430c0 + inline virtual const char *ClassName() const override + { + // 0x100f03a0 + return "Act3Shark"; + } +}; + +#endif // ACT3SHARK_H diff --git a/LEGO1/act3state.cpp b/LEGO1/act3state.cpp new file mode 100644 index 00000000..5e56a31b --- /dev/null +++ b/LEGO1/act3state.cpp @@ -0,0 +1,7 @@ +#include "act3state.h" + +// OFFSET: LEGO1 0x1000e2f0 +MxBool Act3State::VTable0x14() +{ + return FALSE; +} diff --git a/LEGO1/act3state.h b/LEGO1/act3state.h new file mode 100644 index 00000000..17c19ca6 --- /dev/null +++ b/LEGO1/act3state.h @@ -0,0 +1,37 @@ +#ifndef ACT3STATE_H +#define ACT3STATE_H + +#include "legostate.h" + +// VTABLE 0x100d4fc8 +// SIZE 0xc +class Act3State : public LegoState +{ +public: + inline Act3State() + { + m_unk08 = 0; + } + + // OFFSET: LEGO1 0x1000e300 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f03f0 + return "Act3State"; + } + + // OFFSET: LEGO1 0x1000e310 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Act3State::ClassName()) || LegoState::IsA(name); + } + + virtual MxBool VTable0x14() override; + +private: + // FIXME: May be part of LegoState? Uncertain... + MxU32 m_unk08; + +}; + +#endif // ACT3STATE_H diff --git a/LEGO1/ambulance.cpp b/LEGO1/ambulance.cpp new file mode 100644 index 00000000..6b5e76ad --- /dev/null +++ b/LEGO1/ambulance.cpp @@ -0,0 +1,7 @@ +#include "ambulance.h" + +// OFFSET: LEGO1 0x10035ee0 STUB +Ambulance::Ambulance() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/ambulance.h b/LEGO1/ambulance.h new file mode 100644 index 00000000..dd89af3c --- /dev/null +++ b/LEGO1/ambulance.h @@ -0,0 +1,28 @@ +#ifndef AMBULANCE_H +#define AMBULANCE_H + +#include "islepathactor.h" + +// VTABLE 0x100d71a8 +// SIZE 0x184 +class Ambulance : public IslePathActor +{ +public: + Ambulance(); + + // OFFSET: LEGO1 0x10035fa0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f03c4 + return "Ambulance"; + } + + // OFFSET: LEGO1 0x10035fb0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Ambulance::ClassName()) || IslePathActor::IsA(name); + } + +}; + +#endif // AMBULANCE_H diff --git a/LEGO1/ambulancemissionstate.cpp b/LEGO1/ambulancemissionstate.cpp new file mode 100644 index 00000000..6b20ce3a --- /dev/null +++ b/LEGO1/ambulancemissionstate.cpp @@ -0,0 +1,7 @@ +#include "ambulancemissionstate.h" + +// OFFSET: LEGO1 0x100373a0 STUB +AmbulanceMissionState::AmbulanceMissionState() +{ + // TODO +} diff --git a/LEGO1/ambulancemissionstate.h b/LEGO1/ambulancemissionstate.h new file mode 100644 index 00000000..572bba9a --- /dev/null +++ b/LEGO1/ambulancemissionstate.h @@ -0,0 +1,29 @@ +#ifndef AMBULANCEMISSIONSTATE_H +#define AMBULANCEMISSIONSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d72a0 +// SIZE 0x24 +class AmbulanceMissionState : public LegoState +{ +public: + AmbulanceMissionState(); + + // OFFSET: LEGO1 0x10037600 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f00e8 + return "AmbulanceMissionState"; + } + + // OFFSET: LEGO1 0x10037610 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, AmbulanceMissionState::ClassName()) || LegoState::IsA(name); + } + +}; + + +#endif // AMBULANCEMISSIONSTATE_H diff --git a/LEGO1/animstate.cpp b/LEGO1/animstate.cpp new file mode 100644 index 00000000..887328bb --- /dev/null +++ b/LEGO1/animstate.cpp @@ -0,0 +1,13 @@ +#include "animstate.h" + +// OFFSET: LEGO1 0x10064ff0 STUB +AnimState::AnimState() +{ + // TODO +} + +// OFFSET: LEGO1 0x10065150 STUB +AnimState::~AnimState() +{ + // TODO +} diff --git a/LEGO1/animstate.h b/LEGO1/animstate.h new file mode 100644 index 00000000..2095c1cb --- /dev/null +++ b/LEGO1/animstate.h @@ -0,0 +1,29 @@ +#ifndef ANIMSTATE_H +#define ANIMSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d8d80 +// SIZE 0x1c +class AnimState : public LegoState +{ +public: + AnimState(); + virtual ~AnimState() override; // vtable+0x0 + + // OFFSET: LEGO1 0x10065070 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0460 + return "AnimState"; + } + + // OFFSET: LEGO1 0x10065080 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, AnimState::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // ANIMSTATE_H diff --git a/LEGO1/beachhouseentity.cpp b/LEGO1/beachhouseentity.cpp new file mode 100644 index 00000000..029e022f --- /dev/null +++ b/LEGO1/beachhouseentity.cpp @@ -0,0 +1,9 @@ +#include "beachhouseentity.h" + +// OFFSET: LEGO1 0x100150a0 STUB +long BeachHouseEntity::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/beachhouseentity.h b/LEGO1/beachhouseentity.h new file mode 100644 index 00000000..1749ff54 --- /dev/null +++ b/LEGO1/beachhouseentity.h @@ -0,0 +1,27 @@ +#ifndef BEACHHOUSEENTITY_H +#define BEACHHOUSEENTITY_H + +#include "buildingentity.h" + +// VTABLE 0x100d4a18 +// SIZE 0x68 +class BeachHouseEntity : public BuildingEntity +{ +public: + virtual long Notify(MxParam &p) override; // vtable+04 + + // OFFSET: LEGO1 0x1000ee80 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0314 + return "BeachHouseEntity"; + } + + // OFFSET: LEGO1 0x1000ee90 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(name); + } +}; + +#endif // BEACHHOUSEENTITY_H diff --git a/LEGO1/bike.cpp b/LEGO1/bike.cpp new file mode 100644 index 00000000..ac741a44 --- /dev/null +++ b/LEGO1/bike.cpp @@ -0,0 +1,8 @@ +#include "bike.h" + +// OFFSET: LEGO1 0x10076670 STUB +Bike::Bike() +{ + // TODO +} + diff --git a/LEGO1/bike.h b/LEGO1/bike.h new file mode 100644 index 00000000..8d2de0f1 --- /dev/null +++ b/LEGO1/bike.h @@ -0,0 +1,29 @@ +#ifndef BIKE_H +#define BIKE_H + +#include "islepathactor.h" + +// VTABLE 0x100d9808 +// SIZE 0x164 +class Bike : public IslePathActor +{ +public: + Bike(); + + // OFFSET: LEGO1 0x100766f0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f03d0 + return "Bike"; + } + + // OFFSET: LEGO1 0x10076700 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Bike::ClassName()) || IslePathActor::IsA(name); + } + +}; + + +#endif // BIKE_H diff --git a/LEGO1/buildingentity.cpp b/LEGO1/buildingentity.cpp new file mode 100644 index 00000000..b4611955 --- /dev/null +++ b/LEGO1/buildingentity.cpp @@ -0,0 +1,13 @@ +#include "buildingentity.h" + +// OFFSET: LEGO1 0x10014e20 STUB +BuildingEntity::BuildingEntity() +{ + // TODO +} + +// OFFSET: LEGO1 0x10015030 STUB +BuildingEntity::~BuildingEntity() +{ + // TODO +} diff --git a/LEGO1/buildingentity.h b/LEGO1/buildingentity.h new file mode 100644 index 00000000..0f515cb0 --- /dev/null +++ b/LEGO1/buildingentity.h @@ -0,0 +1,28 @@ +#ifndef BUILDINGENTITY_H +#define BUILDINGENTITY_H + +#include "legoentity.h" + +// VTABLE 0x100d5c88 +// SIZE <= 0x68, hard to tell because it's always constructed as a derivative +class BuildingEntity : public LegoEntity +{ +public: + BuildingEntity(); + virtual ~BuildingEntity() override; // vtable+0x0 + + // OFFSET: LEGO1 0x10014f20 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f07e8 + return "BuildingEntity"; + } + + // OFFSET: LEGO1 0x10014f30 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, BuildingEntity::ClassName()) || LegoEntity::IsA(name); + } +}; + +#endif // BUILDINGENTITY_H diff --git a/LEGO1/bumpbouy.cpp b/LEGO1/bumpbouy.cpp new file mode 100644 index 00000000..c4c8069d --- /dev/null +++ b/LEGO1/bumpbouy.cpp @@ -0,0 +1 @@ +#include "bumpbouy.h" diff --git a/LEGO1/bumpbouy.h b/LEGO1/bumpbouy.h new file mode 100644 index 00000000..58553153 --- /dev/null +++ b/LEGO1/bumpbouy.h @@ -0,0 +1,25 @@ +#ifndef BUMPBOUY_H +#define BUMPBOUY_H + +#include "legoanimactor.h" +#include "mxtypes.h" + +// VTABLE 0x100d6790 +class BumpBouy : public LegoAnimActor +{ +public: + // OFFSET: LEGO1 0x100274e0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0394 + return "BumpBouy"; + } + + // OFFSET: LEGO1 0x10027500 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, BumpBouy::ClassName()) || LegoAnimActor::IsA(name); + } +}; + +#endif // BUMPBOUY_H diff --git a/LEGO1/carrace.cpp b/LEGO1/carrace.cpp new file mode 100644 index 00000000..7c5c522c --- /dev/null +++ b/LEGO1/carrace.cpp @@ -0,0 +1,7 @@ +#include "carrace.h" + +// OFFSET: LEGO1 0x10016a90 STUB +CarRace::CarRace() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/carrace.h b/LEGO1/carrace.h new file mode 100644 index 00000000..23230da0 --- /dev/null +++ b/LEGO1/carrace.h @@ -0,0 +1,27 @@ +#ifndef CARRACE_H +#define CARRACE_H + +#include "legorace.h" + +// VTABLE 0x100d5e50 +// SIZE 0x154 +class CarRace : public LegoRace +{ +public: + CarRace(); + + // OFFSET: LEGO1 0x10016b20 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0528 + return "CarRace"; + } + + // OFFSET: LEGO1 0x10016b30 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, CarRace::ClassName()) || LegoRace::IsA(name); + } +}; + +#endif // CARRACE_H diff --git a/LEGO1/carracestate.h b/LEGO1/carracestate.h new file mode 100644 index 00000000..49e77b5d --- /dev/null +++ b/LEGO1/carracestate.h @@ -0,0 +1,25 @@ +#ifndef CARRACESTATE_H +#define CARRACESTATE_H + +#include "racestate.h" + +// VTABLE 0x100d4b70 +// SIZE 0x2c +class CarRaceState : public RaceState +{ +public: + // OFFSET: LEGO1 0x1000dd30 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f009c + return "CarRaceState"; + } + + // OFFSET: LEGO1 0x1000dd40 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, CarRaceState::ClassName()) || RaceState::IsA(name); + } +}; + +#endif // CARRACESTATE_H diff --git a/LEGO1/doors.h b/LEGO1/doors.h new file mode 100644 index 00000000..702a47ce --- /dev/null +++ b/LEGO1/doors.h @@ -0,0 +1,26 @@ +#ifndef DOORS_H +#define DOORS_H + +#include "legopathactor.h" + +// VTABLE 0x100d4788 +// SIZE 0x1f8 +class Doors : public LegoPathActor +{ +public: + // OFFSET: LEGO1 0x1000e430 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f03e8 + return "Doors"; + } + + // OFFSET: LEGO1 0x1000e440 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Doors::ClassName()) || LegoPathActor::IsA(name); + } +}; + + +#endif // DOORS_H diff --git a/LEGO1/dunebuggy.cpp b/LEGO1/dunebuggy.cpp new file mode 100644 index 00000000..babf21cb --- /dev/null +++ b/LEGO1/dunebuggy.cpp @@ -0,0 +1,7 @@ +#include "dunebuggy.h" + +// OFFSET: LEGO1 0x10067bb0 STUB +DuneBuggy::DuneBuggy() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/dunebuggy.h b/LEGO1/dunebuggy.h new file mode 100644 index 00000000..1f89784e --- /dev/null +++ b/LEGO1/dunebuggy.h @@ -0,0 +1,28 @@ +#ifndef DUNEBUGGY_H +#define DUNEBUGGY_H + +#include "islepathactor.h" + +// VTABLE 0x100d8f98 +// SIZE 0x16c +class DuneBuggy : public IslePathActor +{ +public: + DuneBuggy(); + + // OFFSET: LEGO1 0x10067c30 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0410 + return "DuneBuggy"; + } + + // OFFSET: LEGO1 0x10067c40 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, DuneBuggy::ClassName()) || IslePathActor::IsA(name); + } + +}; + +#endif // DUNEBUGGY_H diff --git a/LEGO1/elevatorbottom.cpp b/LEGO1/elevatorbottom.cpp new file mode 100644 index 00000000..d216fe35 --- /dev/null +++ b/LEGO1/elevatorbottom.cpp @@ -0,0 +1,21 @@ +#include "elevatorbottom.h" + +// OFFSET: LEGO1 0x10017e90 STUB +ElevatorBottom::ElevatorBottom() +{ + // TODO +} + +// OFFSET: LEGO1 0x10018060 STUB +ElevatorBottom::~ElevatorBottom() +{ + // TODO +} + +// OFFSET: LEGO1 0x10018150 STUB +long ElevatorBottom::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/elevatorbottom.h b/LEGO1/elevatorbottom.h new file mode 100644 index 00000000..0d86080a --- /dev/null +++ b/LEGO1/elevatorbottom.h @@ -0,0 +1,30 @@ +#ifndef ELEVATORBOTTOM_H +#define ELEVATORBOTTOM_H + +#include "legoworld.h" + +// VTABLE 0x100d5f20 +class ElevatorBottom : public LegoWorld +{ +public: + ElevatorBottom(); + virtual ~ElevatorBottom() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + + // OFFSET: LEGO1 0x10017f20 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f04ac + return "ElevatorBottom"; + } + + // OFFSET: LEGO1 0x10017f30 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, ElevatorBottom::ClassName()) || LegoWorld::IsA(name); + } + +}; + +#endif // ELEVATORBOTTOM_H diff --git a/LEGO1/gasstation.cpp b/LEGO1/gasstation.cpp new file mode 100644 index 00000000..d50ef317 --- /dev/null +++ b/LEGO1/gasstation.cpp @@ -0,0 +1,29 @@ +#include "gasstation.h" + +// OFFSET: LEGO1 0x100046a0 STUB +GasStation::GasStation() +{ + // TODO +} + +// OFFSET: LEGO1 0x100048c0 STUB +GasStation::~GasStation() +{ + // TODO +} + +// OFFSET: LEGO1 0x10004a60 STUB +long GasStation::Notify(MxParam &p) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x10005c90 STUB +long GasStation::Tickle() +{ + // TODO + + return 0; +} diff --git a/LEGO1/gasstation.h b/LEGO1/gasstation.h new file mode 100644 index 00000000..9f22ca3f --- /dev/null +++ b/LEGO1/gasstation.h @@ -0,0 +1,33 @@ +#ifndef GASSTATION_H +#define GASSTATION_H + +#include "legoworld.h" + +// VTABLE 0x100d4650 +// SIZE 0x128 +// Radio variable at 0x46, in constructor +class GasStation : public LegoWorld +{ +public: + GasStation(); + virtual ~GasStation() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual long Tickle() override; // vtable+0x8 + + // OFFSET: LEGO1 0x10004780 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0168 + return "GasStation"; + } + + // OFFSET: LEGO1 0x10004790 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, GasStation::ClassName()) || LegoWorld::IsA(name); + } + +}; + +#endif // GASSTATION_H diff --git a/LEGO1/gasstationentity.cpp b/LEGO1/gasstationentity.cpp new file mode 100644 index 00000000..ebe58c46 --- /dev/null +++ b/LEGO1/gasstationentity.cpp @@ -0,0 +1 @@ +#include "gasstationentity.h" diff --git a/LEGO1/gasstationentity.h b/LEGO1/gasstationentity.h new file mode 100644 index 00000000..27eb60f3 --- /dev/null +++ b/LEGO1/gasstationentity.h @@ -0,0 +1,25 @@ +#ifndef GASSTATIONENTITY_H +#define GASSTATIONENTITY_H + +#include "buildingentity.h" + +// VTABLE 0x100d5258 +// SIZE 0x68 +class GasStationEntity : public BuildingEntity +{ +public: + // OFFSET: LEGO1 0x1000eb20 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0348 + return "GasStationEntity"; + } + + // OFFSET: LEGO1 0x1000eb30 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, GasStationEntity::ClassName()) || BuildingEntity::IsA(name); + } +}; + +#endif // GASSTATIONENTITY_H diff --git a/LEGO1/gasstationstate.cpp b/LEGO1/gasstationstate.cpp new file mode 100644 index 00000000..d9fa2c29 --- /dev/null +++ b/LEGO1/gasstationstate.cpp @@ -0,0 +1,7 @@ +#include "gasstationstate.h" + +// OFFSET: LEGO1 0x10005eb0 STUB +GasStationState::GasStationState() +{ + // TODO +} diff --git a/LEGO1/gasstationstate.h b/LEGO1/gasstationstate.h new file mode 100644 index 00000000..a7696bed --- /dev/null +++ b/LEGO1/gasstationstate.h @@ -0,0 +1,28 @@ +#ifndef GASSTATIONSTATE_H +#define GASSTATIONSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d46e0 +// SIZE 0x24 +class GasStationState : public LegoState +{ +public: + GasStationState(); + + // OFFSET: LEGO1 0x100061d0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0174 + return "GasStationState"; + } + + // OFFSET: LEGO1 0x100061e0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, GasStationState::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // GASSTATIONSTATE_H diff --git a/LEGO1/helicopter.cpp b/LEGO1/helicopter.cpp new file mode 100644 index 00000000..318f3dab --- /dev/null +++ b/LEGO1/helicopter.cpp @@ -0,0 +1,13 @@ +#include "helicopter.h" + +// OFFSET: LEGO1 0x10001e60 STUB +Helicopter::Helicopter() +{ + // TODO +} + +// OFFSET: LEGO1 0x10003230 STUB +Helicopter::~Helicopter() +{ + // TODO +} diff --git a/LEGO1/helicopter.h b/LEGO1/helicopter.h new file mode 100644 index 00000000..15134f32 --- /dev/null +++ b/LEGO1/helicopter.h @@ -0,0 +1,29 @@ +#ifndef HELICOPTER_H +#define HELICOPTER_H + +#include "islepathactor.h" + +// VTABLE 0x100d40f8 +// SIZE 0x230 +class Helicopter : public IslePathActor +{ +public: + Helicopter(); + virtual ~Helicopter(); // vtable+0x0 + + // OFFSET: LEGO1 0x10003070 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0130 + return "Helicopter"; + } + + // OFFSET: LEGO1 0x10003080 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Helicopter::ClassName()) || IslePathActor::IsA(name); + } + +}; + +#endif // HELICOPTER_H diff --git a/LEGO1/helicopterstate.cpp b/LEGO1/helicopterstate.cpp new file mode 100644 index 00000000..70d71a0c --- /dev/null +++ b/LEGO1/helicopterstate.cpp @@ -0,0 +1 @@ +#include "helicopterstate.h" diff --git a/LEGO1/helicopterstate.h b/LEGO1/helicopterstate.h new file mode 100644 index 00000000..161624dd --- /dev/null +++ b/LEGO1/helicopterstate.h @@ -0,0 +1,25 @@ +#ifndef HELICOPTERSTATE_H +#define HELICOPTERSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d5418 +// SIZE 0xc +class HelicopterState : public LegoState +{ +public: + // OFFSET: LEGO1 0x1000e0d0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0144 + return "HelicopterState"; + } + + // OFFSET: LEGO1 0x1000e0e0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, HelicopterState::ClassName()) || LegoState::IsA(name); + } +}; + +#endif // HELICOPTERSTATE_H diff --git a/LEGO1/historybook.cpp b/LEGO1/historybook.cpp new file mode 100644 index 00000000..89c81315 --- /dev/null +++ b/LEGO1/historybook.cpp @@ -0,0 +1,21 @@ +#include "historybook.h" + +// OFFSET: LEGO1 0x100822f0 STUB +HistoryBook::HistoryBook() +{ + // TODO +} + +// OFFSET: LEGO1 0x100824d0 STUB +HistoryBook::~HistoryBook() +{ + // TODO +} + +// OFFSET: LEGO1 0x10082680 STUB +long HistoryBook::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/historybook.h b/LEGO1/historybook.h new file mode 100644 index 00000000..bbdc6246 --- /dev/null +++ b/LEGO1/historybook.h @@ -0,0 +1,30 @@ +#ifndef HISTORYBOOK_H +#define HISTORYBOOK_H + +#include "legoworld.h" + +// VTABLE 0x100da328 +// SIZE 0x3e4 +class HistoryBook : public LegoWorld +{ +public: + HistoryBook(); + virtual ~HistoryBook() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + + // OFFSET: LEGO1 0x10082390 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f04bc + return "HistoryBook"; + } + + // OFFSET: LEGO1 0x100823a0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, HistoryBook::ClassName()) || LegoWorld::IsA(name); + } +}; + +#endif // HISTORYBOOK_H diff --git a/LEGO1/hospital.cpp b/LEGO1/hospital.cpp new file mode 100644 index 00000000..2581cf34 --- /dev/null +++ b/LEGO1/hospital.cpp @@ -0,0 +1,21 @@ +#include "hospital.h" + +// OFFSET: LEGO1 0x100745e0 STUB +Hospital::Hospital() +{ + // TODO +} + +// OFFSET: LEGO1 0x100747f0 STUB +Hospital::~Hospital() +{ + // TODO +} + +// OFFSET: LEGO1 0x10074990 STUB +long Hospital::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/hospital.h b/LEGO1/hospital.h new file mode 100644 index 00000000..b14de205 --- /dev/null +++ b/LEGO1/hospital.h @@ -0,0 +1,31 @@ +#ifndef HOSPITAL_H +#define HOSPITAL_H + +#include "legoworld.h" + +// VTABLE 0x100d9730 +// SIZE 0x12c +class Hospital : public LegoWorld +{ +public: + Hospital(); + virtual ~Hospital() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x04 + + // OFFSET: LEGO1 0x100746b0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0490 + return "Hospital"; + } + + // OFFSET: LEGO1 0x100746c0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Hospital::ClassName()) || LegoWorld::IsA(name); + } + +}; + +#endif // HOSPITAL_H diff --git a/LEGO1/hospitalentity.cpp b/LEGO1/hospitalentity.cpp new file mode 100644 index 00000000..8da86464 --- /dev/null +++ b/LEGO1/hospitalentity.cpp @@ -0,0 +1 @@ +#include "hospitalentity.h" diff --git a/LEGO1/hospitalentity.h b/LEGO1/hospitalentity.h new file mode 100644 index 00000000..537bff12 --- /dev/null +++ b/LEGO1/hospitalentity.h @@ -0,0 +1,26 @@ +#ifndef HOSPITALENTITY_H +#define HOSPITALENTITY_H + +#include "buildingentity.h" + +// VTABLE 0x100d5068 +// SIZE 0x68 +class HospitalEntity : public BuildingEntity +{ +public: + // OFFSET: LEGO1 0x1000ec40 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0338 + return "HospitalEntity"; + } + + // OFFSET: LEGO1 0x1000ec50 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, HospitalEntity::ClassName()) || BuildingEntity::IsA(name); + } + +}; + +#endif // HOSPITALENTITY_H diff --git a/LEGO1/hospitalstate.cpp b/LEGO1/hospitalstate.cpp new file mode 100644 index 00000000..066dceec --- /dev/null +++ b/LEGO1/hospitalstate.cpp @@ -0,0 +1,7 @@ +#include "hospitalstate.h" + +// OFFSET: LEGO1 0x10076370 STUB +HospitalState::HospitalState() +{ + // TODO +} diff --git a/LEGO1/hospitalstate.h b/LEGO1/hospitalstate.h new file mode 100644 index 00000000..ccecf07b --- /dev/null +++ b/LEGO1/hospitalstate.h @@ -0,0 +1,28 @@ +#ifndef HOSPITALSTATE_H +#define HOSPITALSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d97a0 +// SIZE 0x18 +class HospitalState : public LegoState +{ +public: + HospitalState(); + + // OFFSET: LEGO1 0x10076400 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0480 + return "HospitalState"; + } + + // OFFSET: LEGO1 0x10076410 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, HospitalState::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // HOSPITALSTATE_H diff --git a/LEGO1/infocenter.cpp b/LEGO1/infocenter.cpp new file mode 100644 index 00000000..1ad07ee4 --- /dev/null +++ b/LEGO1/infocenter.cpp @@ -0,0 +1,29 @@ +#include "infocenter.h" + +// OFFSET: LEGO1 0x1006ea20 STUB +Infocenter::Infocenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x1006ec90 STUB +Infocenter::~Infocenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x1006ef10 STUB +long Infocenter::Notify(MxParam &p) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x10070af0 STUB +long Infocenter::Tickle() +{ + // TODO + + return 0; +} diff --git a/LEGO1/infocenter.h b/LEGO1/infocenter.h new file mode 100644 index 00000000..49a71acb --- /dev/null +++ b/LEGO1/infocenter.h @@ -0,0 +1,32 @@ +#ifndef INFOCENTER_H +#define INFOCENTER_H + +#include "legoworld.h" + +// VTABLE 0x100d9338 +// SIZE 0x1d8 +class Infocenter : public LegoWorld +{ +public: + Infocenter(); + virtual ~Infocenter() override; + + virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual long Tickle() override; // vtable+0x8 + + // OFFSET: LEGO1 0x1006eb40 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f04ec + return "Infocenter"; + } + + // OFFSET: LEGO1 0x1006eb50 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Infocenter::ClassName()) || LegoWorld::IsA(name); + } + +}; + +#endif // INFOCENTER_H diff --git a/LEGO1/infocenterdoor.cpp b/LEGO1/infocenterdoor.cpp new file mode 100644 index 00000000..be57f96e --- /dev/null +++ b/LEGO1/infocenterdoor.cpp @@ -0,0 +1,21 @@ +#include "infocenterdoor.h" + +// OFFSET: LEGO1 0x10037730 STUB +InfocenterDoor::InfocenterDoor() +{ + // TODO +} + +// OFFSET: LEGO1 0x100378f0 STUB +InfocenterDoor::~InfocenterDoor() +{ + // TODO +} + +// OFFSET: LEGO1 0x100379e0 STUB +long InfocenterDoor::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/infocenterdoor.h b/LEGO1/infocenterdoor.h new file mode 100644 index 00000000..77a0c021 --- /dev/null +++ b/LEGO1/infocenterdoor.h @@ -0,0 +1,31 @@ +#ifndef INFOCENTERDOOR_H +#define INFOCENTERDOOR_H + +#include "legoworld.h" + +// VTABLE 0x100d72d8 +// SIZE 0xfc +class InfocenterDoor : public LegoWorld +{ +public: + InfocenterDoor(); + virtual ~InfocenterDoor(); // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + + // OFFSET: LEGO1 0x100377b0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f049c + return "InfocenterDoor"; + } + + // OFFSET: LEGO1 0x100377c0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, InfocenterDoor::ClassName()) || LegoWorld::IsA(name); + } + +}; + +#endif // INFOCENTERDOOR_H diff --git a/LEGO1/infocenterentity.cpp b/LEGO1/infocenterentity.cpp new file mode 100644 index 00000000..211cf0b8 --- /dev/null +++ b/LEGO1/infocenterentity.cpp @@ -0,0 +1 @@ +#include "infocenterentity.h" diff --git a/LEGO1/infocenterentity.h b/LEGO1/infocenterentity.h new file mode 100644 index 00000000..3980e68a --- /dev/null +++ b/LEGO1/infocenterentity.h @@ -0,0 +1,26 @@ +#ifndef INFOCENTERENTITY_H +#define INFOCENTERENTITY_H + +#include "buildingentity.h" + +// VTABLE 0x100d4b90 +// SIZE 0x68 +class InfoCenterEntity : public BuildingEntity +{ +public: + // OFFSET: LEGO1 0x1000ea00 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f035c + return "InfoCenterEntity"; + } + + // OFFSET: LEGO1 0x1000ea10 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, InfoCenterEntity::ClassName()) || BuildingEntity::IsA(name); + } + +}; + +#endif // INFOCENTERENTITY_H diff --git a/LEGO1/infocenterstate.cpp b/LEGO1/infocenterstate.cpp new file mode 100644 index 00000000..d680eb43 --- /dev/null +++ b/LEGO1/infocenterstate.cpp @@ -0,0 +1,14 @@ +#include "infocenterstate.h" + +// OFFSET: LEGO1 0x10071600 STUB +InfocenterState::InfocenterState() +{ + // TODO +} + +// OFFSET: LEGO1 0x10071920 STUB +InfocenterState::~InfocenterState() +{ + // TODO +} + diff --git a/LEGO1/infocenterstate.h b/LEGO1/infocenterstate.h new file mode 100644 index 00000000..4f09d496 --- /dev/null +++ b/LEGO1/infocenterstate.h @@ -0,0 +1,28 @@ +#ifndef INFOCENTERSTATE_H +#define INFOCENTERSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d93a8 +// SIZE 0x94 +class InfocenterState : public LegoState +{ +public: + InfocenterState(); + virtual ~InfocenterState(); + + // OFFSET: LEGO1 0x10071840 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f04dc + return "InfocenterState"; + } + + // OFFSET: LEGO1 0x10071850 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, InfocenterState::ClassName()) || LegoState::IsA(name); + } +}; + +#endif // INFOCENTERSTATE_H diff --git a/LEGO1/isle.cpp b/LEGO1/isle.cpp new file mode 100644 index 00000000..fa5d806b --- /dev/null +++ b/LEGO1/isle.cpp @@ -0,0 +1,7 @@ +#include "isle.h" + +// OFFSET: LEGO1 0x10030820 STUB +Isle::Isle() +{ + // TODO +} diff --git a/LEGO1/isle.h b/LEGO1/isle.h new file mode 100644 index 00000000..4aedbbcf --- /dev/null +++ b/LEGO1/isle.h @@ -0,0 +1,28 @@ +#ifndef ISLE_H +#define ISLE_H + +#include "legoworld.h" + +// VTABLE 0x100d6fb8 +// SIZE 0x140 +// Radio at 0x12c +class Isle : public LegoWorld +{ +public: + Isle(); + + // OFFSET: LEGO1 0x10030910 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0458 + return "Isle"; + } + + // OFFSET: LEGO1 0x10030920 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Isle::ClassName()) || LegoWorld::IsA(name); + } +}; + +#endif // ISLE_H diff --git a/LEGO1/isleactor.cpp b/LEGO1/isleactor.cpp new file mode 100644 index 00000000..ca286e37 --- /dev/null +++ b/LEGO1/isleactor.cpp @@ -0,0 +1 @@ +#include "isleactor.h" diff --git a/LEGO1/isleactor.h b/LEGO1/isleactor.h new file mode 100644 index 00000000..3b7660f5 --- /dev/null +++ b/LEGO1/isleactor.h @@ -0,0 +1,24 @@ +#ifndef ISLEACTOR_H +#define ISLEACTOR_H + +#include "legoactor.h" + +// VTABLE 0x100d5178 +class IsleActor : public LegoActor +{ +public: + // OFFSET: LEGO1 0x1000e660 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f07dc + return "IsleActor"; + } + + // OFFSET: LEGO1 0x1000e670 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, IsleActor::ClassName()) || LegoActor::IsA(name); + } +}; + +#endif // ISLEACTOR_H diff --git a/LEGO1/islepathactor.cpp b/LEGO1/islepathactor.cpp new file mode 100644 index 00000000..72ed76d8 --- /dev/null +++ b/LEGO1/islepathactor.cpp @@ -0,0 +1 @@ +#include "islepathactor.h" diff --git a/LEGO1/islepathactor.h b/LEGO1/islepathactor.h new file mode 100644 index 00000000..fce450ac --- /dev/null +++ b/LEGO1/islepathactor.h @@ -0,0 +1,25 @@ +#ifndef ISLEPATHACTOR_H +#define ISLEPATHACTOR_H + +#include "legopathactor.h" + +// VTABLE 0x100d4398 +// SIZE >= 0x230 +class IslePathActor : public LegoPathActor +{ +public: + // OFFSET: LEGO1 0x10002ea0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0104 + return "IslePathActor"; + } + + // OFFSET: LEGO1 0x10002eb0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, IslePathActor::ClassName()) || LegoPathActor::IsA(name); + } +}; + +#endif // ISLEPATHACTOR_H diff --git a/LEGO1/jetski.cpp b/LEGO1/jetski.cpp new file mode 100644 index 00000000..50676253 --- /dev/null +++ b/LEGO1/jetski.cpp @@ -0,0 +1,7 @@ +#include "jetski.h" + +// OFFSET: LEGO1 0x1007e3b0 STUB +Jetski::Jetski() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/jetski.h b/LEGO1/jetski.h new file mode 100644 index 00000000..7cabea4d --- /dev/null +++ b/LEGO1/jetski.h @@ -0,0 +1,29 @@ +#ifndef JETSKI_H +#define JETSKI_H + +#include "islepathactor.h" + +// VTABLE 0x100d9ec8 +// SIZE 0x164 +class Jetski : public IslePathActor +{ +public: + Jetski(); + + // OFFSET: LEGO1 0x1007e430 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f03d8 + return "Jetski"; + } + + // OFFSET: LEGO1 0x1007e440 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Jetski::ClassName()) || IslePathActor::IsA(name); + } + +}; + + +#endif // JETSKI_H diff --git a/LEGO1/jetskirace.cpp b/LEGO1/jetskirace.cpp new file mode 100644 index 00000000..cc119878 --- /dev/null +++ b/LEGO1/jetskirace.cpp @@ -0,0 +1 @@ +#include "jetskirace.h" diff --git a/LEGO1/jetskirace.h b/LEGO1/jetskirace.h new file mode 100644 index 00000000..bea59903 --- /dev/null +++ b/LEGO1/jetskirace.h @@ -0,0 +1,26 @@ +#ifndef JETSKIRACE_H +#define JETSKIRACE_H + +#include "legorace.h" + +// VTABLE 0x100d4fe8 +// SIZE 0x144 +class JetskiRace : public LegoRace +{ +public: + + // OFFSET: LEGO1 0x1000daf0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0530 + return "JetskiRace"; + } + + // OFFSET: LEGO1 0x1000db00 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, JetskiRace::ClassName()) || LegoRace::IsA(name); + } +}; + +#endif // JETSKIRACE_H diff --git a/LEGO1/jetskiracestate.h b/LEGO1/jetskiracestate.h new file mode 100644 index 00000000..bdcfc0cd --- /dev/null +++ b/LEGO1/jetskiracestate.h @@ -0,0 +1,26 @@ +#ifndef JETSKIRACESTATE_H +#define JETSKIRACESTATE_H + +#include "racestate.h" + +// VTABLE 0x100d4fa8 +// SIZE 0x2c +class JetskiRaceState : public RaceState +{ +public: + // OFFSET: LEGO1 0x1000dc40 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f00ac + return "JetskiRaceState"; + } + + // OFFSET: LEGO1 0x1000dc50 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, JetskiRaceState::ClassName()) || RaceState::IsA(name); + } + +}; + +#endif // JETSKIRACESTATE_H diff --git a/LEGO1/jukebox.cpp b/LEGO1/jukebox.cpp new file mode 100644 index 00000000..f169a278 --- /dev/null +++ b/LEGO1/jukebox.cpp @@ -0,0 +1,7 @@ +#include "jukebox.h" + +// OFFSET: LEGO1 0x1005d660 STUB +JukeBox::JukeBox() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/jukebox.h b/LEGO1/jukebox.h new file mode 100644 index 00000000..3083f901 --- /dev/null +++ b/LEGO1/jukebox.h @@ -0,0 +1,28 @@ +#ifndef JUKEBOX_H +#define JUKEBOX_H + +#include "legoworld.h" + +// VTABLE 0x100d8958 +// SIZE 0x104 +class JukeBox : public LegoWorld +{ +public: + JukeBox(); + + // OFFSET: LEGO1 0x1005d6f0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f02cc + return "JukeBox"; + } + + // OFFSET: LEGO1 0x1005d700 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, JukeBox::ClassName()) || LegoWorld::IsA(name); + } + +}; + +#endif // JUKEBOX_H diff --git a/LEGO1/jukeboxentity.cpp b/LEGO1/jukeboxentity.cpp new file mode 100644 index 00000000..8c1a971b --- /dev/null +++ b/LEGO1/jukeboxentity.cpp @@ -0,0 +1,13 @@ +#include "jukeboxentity.h" + +// OFFSET: LEGO1 0x10085bc0 STUB +JukeBoxEntity::JukeBoxEntity() +{ + // TODO +} + +// OFFSET: LEGO1 0x10085dd0 STUB +JukeBoxEntity::~JukeBoxEntity() +{ + // TODO +} diff --git a/LEGO1/jukeboxentity.h b/LEGO1/jukeboxentity.h new file mode 100644 index 00000000..8571f203 --- /dev/null +++ b/LEGO1/jukeboxentity.h @@ -0,0 +1,29 @@ +#ifndef JUKEBOXENTITY_H +#define JUKEBOXENTITY_H + +#include "legoentity.h" + +// VTABLE 0x100da8a0 +// SIZE 0x6c +class JukeBoxEntity : public LegoEntity +{ +public: + JukeBoxEntity(); + virtual ~JukeBoxEntity() override; // vtable+0x0 + + // OFFSET: LEGO1 0x10085cc0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f02f0 + return "JukeBoxEntity"; + } + + // OFFSET: LEGO1 0x10085cd0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, JukeBoxEntity::ClassName()) || LegoEntity::IsA(name); + } + +}; + +#endif // JUKEBOXENTITY_H diff --git a/LEGO1/jukeboxstate.cpp b/LEGO1/jukeboxstate.cpp new file mode 100644 index 00000000..25b6dc90 --- /dev/null +++ b/LEGO1/jukeboxstate.cpp @@ -0,0 +1 @@ +#include "jukeboxstate.h" diff --git a/LEGO1/jukeboxstate.h b/LEGO1/jukeboxstate.h new file mode 100644 index 00000000..75640fe3 --- /dev/null +++ b/LEGO1/jukeboxstate.h @@ -0,0 +1,26 @@ +#ifndef JUKEBOXSTATE_H +#define JUKEBOXSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d4a90 +// SIZE 0x10 +class JukeBoxState : public LegoState +{ +public: + // OFFSET: LEGO1 0x1000f310 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f02bc + return "JukeBoxState"; + } + + // OFFSET: LEGO1 0x1000f320 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, JukeBoxState::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // JUKEBOXSTATE_H diff --git a/LEGO1/lego3dwavepresenter.h b/LEGO1/lego3dwavepresenter.h new file mode 100644 index 00000000..b9a2b7f5 --- /dev/null +++ b/LEGO1/lego3dwavepresenter.h @@ -0,0 +1,25 @@ +#ifndef LEGO3DWAVEPRESENTER_H +#define LEGO3DWAVEPRESENTER_H + +#include "legowavepresenter.h" + +// VTABLE 0x100d52b0 +// SIZE 0xa0 +class Lego3DWavePresenter : public LegoWavePresenter +{ +public: + // OFFSET: LEGO1 0x1000d890 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f058c + return "Lego3DWavePresenter"; + } + + // OFFSET: LEGO1 0x1000d8a0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Lego3DWavePresenter::ClassName()) || MxWavePresenter::IsA(name); + } +}; + +#endif // LEGO3DWAVEPRESENTER_H diff --git a/LEGO1/legoact2state.cpp b/LEGO1/legoact2state.cpp new file mode 100644 index 00000000..1ca6a144 --- /dev/null +++ b/LEGO1/legoact2state.cpp @@ -0,0 +1 @@ +#include "legoact2state.h" diff --git a/LEGO1/legoact2state.h b/LEGO1/legoact2state.h new file mode 100644 index 00000000..321138ba --- /dev/null +++ b/LEGO1/legoact2state.h @@ -0,0 +1,26 @@ +#ifndef LEGOACT2STATE_H +#define LEGOACT2STATE_H + +#include "legostate.h" + +// VTABLE 0x100d4a70 +// SIZE 0x10 +class LegoAct2State : public LegoState +{ +public: + // OFFSET: LEGO1 0x1000df80 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0428 + return "LegoAct2State"; + } + + // OFFSET: LEGO1 0x1000df90 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoAct2State::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // LEGOACT2STATE_H diff --git a/LEGO1/legoactioncontrolpresenter.cpp b/LEGO1/legoactioncontrolpresenter.cpp new file mode 100644 index 00000000..598c0958 --- /dev/null +++ b/LEGO1/legoactioncontrolpresenter.cpp @@ -0,0 +1 @@ +#include "legoactioncontrolpresenter.h" diff --git a/LEGO1/legoactioncontrolpresenter.h b/LEGO1/legoactioncontrolpresenter.h new file mode 100644 index 00000000..7e051805 --- /dev/null +++ b/LEGO1/legoactioncontrolpresenter.h @@ -0,0 +1,25 @@ +#ifndef LEGOACTIONCONTROLPRESENTER_H +#define LEGOACTIONCONTROLPRESENTER_H + +#include "mxmediapresenter.h" + +// VTABLE 0x100d5118 +// SIZE 0x68 +class LegoActionControlPresenter : public MxMediaPresenter +{ +public: + // OFFSET: LEGO1 0x1000d0e0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f05bc + return "LegoActionControlPresenter"; + } + + // OFFSET: LEGO1 0x1000d0f0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoActionControlPresenter::ClassName()) || MxMediaPresenter::IsA(name); + } +}; + +#endif // LEGOACTIONCONTROLPRESENTER_H diff --git a/LEGO1/legoactor.h b/LEGO1/legoactor.h new file mode 100644 index 00000000..9b23e943 --- /dev/null +++ b/LEGO1/legoactor.h @@ -0,0 +1,25 @@ +#ifndef LEGOACTOR_H +#define LEGOACTOR_H + +#include "legoentity.h" + +// VTABLE 0x100d6d68 +// SIZE 0x78 +class LegoActor : public LegoEntity +{ +public: + // OFFSET: LEGO1 0x1002d210 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0124 + return "LegoActor"; + } + + // OFFSET: LEGO1 0x1002d220 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoActor::ClassName()) || LegoEntity::IsA(name); + } +}; + +#endif // LEGOACTOR_H diff --git a/LEGO1/legoactorpresenter.h b/LEGO1/legoactorpresenter.h new file mode 100644 index 00000000..fd3ae4e7 --- /dev/null +++ b/LEGO1/legoactorpresenter.h @@ -0,0 +1,25 @@ +#ifndef LEGOACTORPRESENTER_H +#define LEGOACTORPRESENTER_H + +#include "legoentitypresenter.h" + +// VTABLE 0x100d5320 +// SIZE 0x50 +class LegoActorPresenter : public LegoEntityPresenter +{ +public: + // OFFSET: LEGO1 0x1000cb10 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f06a4 + return "LegoActorPresenter"; + } + + // OFFSET: LEGO1 0x1000cb20 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoActorPresenter::ClassName()) || LegoEntityPresenter::IsA(name); + } +}; + +#endif // LEGOACTORPRESENTER_H diff --git a/LEGO1/legoanimactor.cpp b/LEGO1/legoanimactor.cpp new file mode 100644 index 00000000..d3515937 --- /dev/null +++ b/LEGO1/legoanimactor.cpp @@ -0,0 +1 @@ +#include "legoanimactor.h" diff --git a/LEGO1/legoanimactor.h b/LEGO1/legoanimactor.h new file mode 100644 index 00000000..f535028c --- /dev/null +++ b/LEGO1/legoanimactor.h @@ -0,0 +1,11 @@ +#ifndef LEGOANIMACTOR_H +#define LEGOANIMACTOR_H + +#include "legopathactor.h" + +class LegoAnimActor : public LegoPathActor +{ +public: +}; + +#endif // LEGOANIMACTOR_H diff --git a/LEGO1/legoanimationmanager.cpp b/LEGO1/legoanimationmanager.cpp new file mode 100644 index 00000000..48f13ce8 --- /dev/null +++ b/LEGO1/legoanimationmanager.cpp @@ -0,0 +1,34 @@ +#include "legoanimationmanager.h" + +// OFFSET: LEGO1 0x1005eb60 STUB +LegoAnimationManager::LegoAnimationManager() +{ +} + +// OFFSET: LEGO1 0x1005ed30 STUB +LegoAnimationManager::~LegoAnimationManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x100619f0 STUB +long LegoAnimationManager::Notify(MxParam &p) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x10061cc0 STUB +long LegoAnimationManager::Tickle() +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x1005f130 STUB +void LegoAnimationManager::Init() +{ + // TODO +} diff --git a/LEGO1/legoanimationmanager.h b/LEGO1/legoanimationmanager.h index 8e243dd3..5fae368e 100644 --- a/LEGO1/legoanimationmanager.h +++ b/LEGO1/legoanimationmanager.h @@ -1,10 +1,37 @@ #ifndef LEGOANIMATIONMANAGER_H #define LEGOANIMATIONMANAGER_H -class LegoAnimationManager +#include "mxcore.h" + +// VTABLE 0x100d8c18 +// SIZE 0x500 +class LegoAnimationManager : public MxCore { public: + LegoAnimationManager(); + virtual ~LegoAnimationManager() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual long Tickle() override; // vtable+0x8 + + // OFFSET: LEGO1 0x1005ec80 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f7508 + return "LegoAnimationManager"; + } + + // OFFSET: LEGO1 0x1005ec90 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoAnimationManager::ClassName()) || MxCore::IsA(name); + } + __declspec(dllexport) static void configureLegoAnimationManager(int param_1); + +private: + void Init(); + }; #endif // LEGOANIMATIONMANAGER_H diff --git a/LEGO1/legoanimmmpresenter.cpp b/LEGO1/legoanimmmpresenter.cpp new file mode 100644 index 00000000..1c98b7c1 --- /dev/null +++ b/LEGO1/legoanimmmpresenter.cpp @@ -0,0 +1,7 @@ +#include "legoanimmmpresenter.h" + +// OFFSET: LEGO1 0x1004a8d0 STUB +LegoAnimMMPresenter::LegoAnimMMPresenter() +{ + // TODO +} diff --git a/LEGO1/legoanimmmpresenter.h b/LEGO1/legoanimmmpresenter.h new file mode 100644 index 00000000..8cb61be0 --- /dev/null +++ b/LEGO1/legoanimmmpresenter.h @@ -0,0 +1,28 @@ +#ifndef LEGOANIMMMPRESENTER_H +#define LEGOANIMMMPRESENTER_H + +#include "mxcompositepresenter.h" + +// VTABLE 0x100d7de8 +// SIZE 0x74 +class LegoAnimMMPresenter : public MxCompositePresenter +{ +public: + LegoAnimMMPresenter(); + + // OFFSET: LEGO1 0x1004a950 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f046c + return "LegoAnimMMPresenter"; + } + + // OFFSET: LEGO1 0x1004a960 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoAnimMMPresenter::ClassName()) || MxCompositePresenter::IsA(name); + } + +}; + +#endif // LEGOANIMMMPRESENTER_H diff --git a/LEGO1/legoanimpresenter.cpp b/LEGO1/legoanimpresenter.cpp new file mode 100644 index 00000000..a968afe0 --- /dev/null +++ b/LEGO1/legoanimpresenter.cpp @@ -0,0 +1,13 @@ +#include "legoanimpresenter.h" + +// OFFSET: LEGO1 0x10068420 STUB +LegoAnimPresenter::LegoAnimPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100686f0 STUB +void LegoAnimPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/legoanimpresenter.h b/LEGO1/legoanimpresenter.h new file mode 100644 index 00000000..56fcc989 --- /dev/null +++ b/LEGO1/legoanimpresenter.h @@ -0,0 +1,30 @@ +#ifndef LEGOANIMPRESENTER_H +#define LEGOANIMPRESENTER_H + +#include "mxvideopresenter.h" + +// VTABLE 0x100d90c8 +class LegoAnimPresenter : public MxVideoPresenter +{ +public: + LegoAnimPresenter(); + + // OFFSET: LEGO1 0x10068530 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f071c + return "LegoAnimPresenter"; + } + + // OFFSET: LEGO1 0x10068540 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoAnimPresenter::ClassName()) || MxVideoPresenter::IsA(name); + } + +private: + void Init(); + +}; + +#endif // LEGOANIMPRESENTER_H diff --git a/LEGO1/legobuildingmanager.cpp b/LEGO1/legobuildingmanager.cpp new file mode 100644 index 00000000..b2c4e7ea --- /dev/null +++ b/LEGO1/legobuildingmanager.cpp @@ -0,0 +1,17 @@ +#include "legobuildingmanager.h" + +// OFFSET: LEGO1 0x1002f8c0 STUB +LegoBuildingManager::LegoBuildingManager() +{ +} + +// OFFSET: LEGO1 0x1002f960 STUB +LegoBuildingManager::~LegoBuildingManager() +{ +} + +// OFFSET: LEGO1 0x1002f9d0 STUB +void LegoBuildingManager::Init() +{ + // TODO +} diff --git a/LEGO1/legobuildingmanager.h b/LEGO1/legobuildingmanager.h index a1173d3d..17701617 100644 --- a/LEGO1/legobuildingmanager.h +++ b/LEGO1/legobuildingmanager.h @@ -1,10 +1,28 @@ #ifndef LEGOBUILDINGMANAGER_H #define LEGOBUILDINGMANAGER_H -class LegoBuildingManager +#include "mxcore.h" + +// VTABLE 0x100d6f50 +// SIZE 0x30 +class LegoBuildingManager : public MxCore { public: + LegoBuildingManager(); + virtual ~LegoBuildingManager() override; + + // OFFSET: LEGO1 0x1002f930 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f37d0 + return "LegoBuildingManager"; + } + __declspec(dllexport) static void configureLegoBuildingManager(int param_1); + +private: + void Init(); + }; #endif // LEGOBUILDINGMANAGER_H diff --git a/LEGO1/legocachesound.cpp b/LEGO1/legocachesound.cpp new file mode 100644 index 00000000..37495920 --- /dev/null +++ b/LEGO1/legocachesound.cpp @@ -0,0 +1,19 @@ +#include "legocachesound.h" + +// OFFSET: LEGO1 0x100064d0 +LegoCacheSound::LegoCacheSound() +{ + Init(); +} + +// OFFSET: LEGO1 0x10006630 STUB +LegoCacheSound::~LegoCacheSound() +{ + // TODO +} + +// OFFSET: LEGO1 0x100066d0 STUB +void LegoCacheSound::Init() +{ + // TODO +} diff --git a/LEGO1/legocachesound.h b/LEGO1/legocachesound.h new file mode 100644 index 00000000..3506aa95 --- /dev/null +++ b/LEGO1/legocachesound.h @@ -0,0 +1,31 @@ +#ifndef LEGOCACHESOUND_H +#define LEGOCACHESOUND_H + +#include "mxcore.h" + +// VTABLE 0x100d4718 +// SIZE 0x88 +class LegoCacheSound : public MxCore +{ +public: + LegoCacheSound(); + virtual ~LegoCacheSound() override; // vtable+0x0 + + // OFFSET: LEGO1 0x10006580 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f01c4 + return "LegoCacheSound"; + } + + // OFFSET: LEGO1 0x10006590 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoCacheSound::ClassName()) || MxCore::IsA(name); + } + +private: + void Init(); +}; + +#endif // LEGOCACHESOUND_H diff --git a/LEGO1/legocameracontroller.cpp b/LEGO1/legocameracontroller.cpp new file mode 100644 index 00000000..da023851 --- /dev/null +++ b/LEGO1/legocameracontroller.cpp @@ -0,0 +1,13 @@ +#include "legocameracontroller.h" + +// OFFSET: LEGO1 0x10011d50 STUB +LegoCameraController::LegoCameraController() +{ + // TODO +} + +// OFFSET: LEGO1 0x10011f70 STUB +LegoCameraController::~LegoCameraController() +{ + // TODO +} diff --git a/LEGO1/legocameracontroller.h b/LEGO1/legocameracontroller.h new file mode 100644 index 00000000..af5015ae --- /dev/null +++ b/LEGO1/legocameracontroller.h @@ -0,0 +1,29 @@ +#ifndef LEGOCAMERACONTROLLER_H +#define LEGOCAMERACONTROLLER_H + +#include "mxcore.h" + +// VTABLE 0x100d57b0 +// SIZE 0xc8 +class LegoCameraController : public MxCore +{ +public: + LegoCameraController(); + virtual ~LegoCameraController() override; // vtable+0x0 + + // OFFSET: LEGO1 0x10011ec0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0850 + return "LegoCameraController"; + } + + // OFFSET: LEGO1 0x10011ed0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoCameraController::ClassName()) || MxCore::IsA(name); + } + +}; + +#endif // LEGOCAMERACONTROLLER_H diff --git a/LEGO1/legocarbuild.cpp b/LEGO1/legocarbuild.cpp new file mode 100644 index 00000000..d96668e4 --- /dev/null +++ b/LEGO1/legocarbuild.cpp @@ -0,0 +1,29 @@ +#include "legocarbuild.h" + +// OFFSET: LEGO1 0x100226d0 STUB +LegoCarBuild::LegoCarBuild() +{ + // TODO +} + +// OFFSET: LEGO1 0x10022a80 STUB +LegoCarBuild::~LegoCarBuild() +{ + // TODO +} + +// OFFSET: LEGO1 0x10024050 STUB +long LegoCarBuild::Notify(MxParam &p) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x100238b0 STUB +long LegoCarBuild::Tickle() +{ + // TODO + + return 0; +} diff --git a/LEGO1/legocarbuild.h b/LEGO1/legocarbuild.h new file mode 100644 index 00000000..10396c9e --- /dev/null +++ b/LEGO1/legocarbuild.h @@ -0,0 +1,31 @@ +#ifndef LEGOCARBUILD_H +#define LEGOCARBUILD_H + +#include "legoworld.h" + +// VTABLE 0x100d6658 +// SIZE 0x34c +class LegoCarBuild : public LegoWorld +{ +public: + LegoCarBuild(); + virtual ~LegoCarBuild() override; + + virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual long Tickle() override; // vtable+0x8 + + // OFFSET: LEGO1 0x10022940 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0504 + return "LegoCarBuild"; + } + + // OFFSET: LEGO1 0x10022950 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoCarBuild::ClassName()) || LegoWorld::IsA(name); + } +}; + +#endif // LEGOCARBUILD_H diff --git a/LEGO1/legocarbuildanimpresenter.cpp b/LEGO1/legocarbuildanimpresenter.cpp new file mode 100644 index 00000000..0b5ee0a5 --- /dev/null +++ b/LEGO1/legocarbuildanimpresenter.cpp @@ -0,0 +1,13 @@ +#include "legocarbuildanimpresenter.h" + +// OFFSET: LEGO1 0x10078400 STUB +LegoCarBuildAnimPresenter::LegoCarBuildAnimPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x10078680 STUB +LegoCarBuildAnimPresenter::~LegoCarBuildAnimPresenter() +{ + // TODO +} diff --git a/LEGO1/legocarbuildanimpresenter.h b/LEGO1/legocarbuildanimpresenter.h new file mode 100644 index 00000000..b270243e --- /dev/null +++ b/LEGO1/legocarbuildanimpresenter.h @@ -0,0 +1,28 @@ +#ifndef LEGOCARBUILDANIMPRESENTER_H +#define LEGOCARBUILDANIMPRESENTER_H + +#include "legoanimpresenter.h" + +// VTABLE 0x100d99e0 +// SIZE 0x150 +class LegoCarBuildAnimPresenter : public LegoAnimPresenter +{ +public: + LegoCarBuildAnimPresenter(); + virtual ~LegoCarBuildAnimPresenter() override; // vtable+0x0 + + // OFFSET: LEGO1 0x10078510 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f05ec + return "LegoCarBuildAnimPresenter"; + } + + // OFFSET: LEGO1 0x10078520 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoCarBuildAnimPresenter::ClassName()) || LegoAnimPresenter::IsA(name); + } +}; + +#endif // LEGOCARBUILDANIMPRESENTER_H diff --git a/LEGO1/legocarraceactor.h b/LEGO1/legocarraceactor.h new file mode 100644 index 00000000..36ba3ab1 --- /dev/null +++ b/LEGO1/legocarraceactor.h @@ -0,0 +1,24 @@ +#ifndef LEGOCARRACEACTOR_H +#define LEGOCARRACEACTOR_H + +#include "legoraceactor.h" + +// VTABLE 0x100da0d8 +class LegoCarRaceActor : public LegoRaceActor +{ +public: + // OFFSET: LEGO1 0x10081650 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0568 + return "LegoCarRaceActor"; + } + + // OFFSET: LEGO1 0x10081670 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoCarRaceActor::ClassName()) || LegoRaceActor::IsA(name); + } +}; + +#endif // LEGOCARRACEACTOR_H diff --git a/LEGO1/legocontrolmanager.cpp b/LEGO1/legocontrolmanager.cpp new file mode 100644 index 00000000..0959df9c --- /dev/null +++ b/LEGO1/legocontrolmanager.cpp @@ -0,0 +1,21 @@ +#include "legocontrolmanager.h" + +// OFFSET: LEGO1 0x10028520 STUB +LegoControlManager::LegoControlManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x10028d60 STUB +LegoControlManager::~LegoControlManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x10029600 STUB +long LegoControlManager::Tickle() +{ + // TODO + + return 0; +} diff --git a/LEGO1/legocontrolmanager.h b/LEGO1/legocontrolmanager.h new file mode 100644 index 00000000..d3e183fd --- /dev/null +++ b/LEGO1/legocontrolmanager.h @@ -0,0 +1,30 @@ +#ifndef LEGOCONTROLMANAGER_H +#define LEGOCONTROLMANAGER_H + +#include "mxcore.h" + +// VTABLE 0x100d6a80 +class LegoControlManager : public MxCore +{ +public: + LegoControlManager(); + virtual ~LegoControlManager() override; // vtable+0x0 + + virtual long Tickle() override; // vtable+0x8 + + // OFFSET: LEGO1 0x10028cb0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f31b8 + return "LegoControlManager"; + } + + // OFFSET: LEGO1 0x10028cc0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoControlManager::ClassName()) || MxCore::IsA(name); + } + +}; + +#endif // LEGOCONTROLMANAGER_H diff --git a/LEGO1/legoentity.cpp b/LEGO1/legoentity.cpp new file mode 100644 index 00000000..fe500cb7 --- /dev/null +++ b/LEGO1/legoentity.cpp @@ -0,0 +1,21 @@ +#include "legoentity.h" + +// OFFSET: LEGO1 0x1000c290 +LegoEntity::~LegoEntity() +{ + Destroy(); +} + +// OFFSET: LEGO1 0x100114f0 STUB +long LegoEntity::Notify(MxParam &p) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x10010810 STUB +void LegoEntity::Destroy() +{ + // TODO +} diff --git a/LEGO1/legoentity.h b/LEGO1/legoentity.h index b64f55a2..774b19f2 100644 --- a/LEGO1/legoentity.h +++ b/LEGO1/legoentity.h @@ -1,10 +1,37 @@ #ifndef LEGOENTITY_H #define LEGOENTITY_H -class LegoEntity +#include "mxentity.h" + +// VTABLE 0x100d4858 +class LegoEntity : public MxEntity { public: - __declspec(dllexport) virtual ~LegoEntity(); + // Inlined at 0x100853f7 + inline LegoEntity() + { + // TODO + } + + __declspec(dllexport) virtual ~LegoEntity() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + + // OFFSET: LEGO1 0x1000c2f0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f0064 + return "LegoEntity"; + } + + // OFFSET: LEGO1 0x1000c300 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoEntity::ClassName()) || MxEntity::IsA(name); + } + + virtual void Destroy() override; // vtable+0x1c + }; #endif // LEGOENTITY_H diff --git a/LEGO1/legoentitypresenter.cpp b/LEGO1/legoentitypresenter.cpp new file mode 100644 index 00000000..e763b771 --- /dev/null +++ b/LEGO1/legoentitypresenter.cpp @@ -0,0 +1,19 @@ +#include "legoentitypresenter.h" + +// OFFSET: LEGO1 0x10053440 +LegoEntityPresenter::LegoEntityPresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x100535d0 STUB +LegoEntityPresenter::~LegoEntityPresenter() +{ + // TODO +} + +// OFFSET: LEG01 0x100535c0 STUB +void LegoEntityPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/legoentitypresenter.h b/LEGO1/legoentitypresenter.h new file mode 100644 index 00000000..e2e82abc --- /dev/null +++ b/LEGO1/legoentitypresenter.h @@ -0,0 +1,32 @@ +#ifndef LEGOENTITYPRESENTER_H +#define LEGOENTITYPRESENTER_H + +#include "mxcompositepresenter.h" + +// VTABLE 0x100d8398 +class LegoEntityPresenter : public MxCompositePresenter +{ +public: + LegoEntityPresenter(); + virtual ~LegoEntityPresenter() override; // vtable+0x0 + + // OFFSET: LEGO1 0x100534b0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f06b8 + return "LegoEntityPresenter"; + } + + // OFFSET: LEGO1 0x100534c0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoEntityPresenter::ClassName()) || MxCompositePresenter::IsA(name); + } + +private: + void Init(); + +}; + + +#endif // LEGOENTITYPRESENTER_H diff --git a/LEGO1/legoextraactor.h b/LEGO1/legoextraactor.h new file mode 100644 index 00000000..5b7f216f --- /dev/null +++ b/LEGO1/legoextraactor.h @@ -0,0 +1,24 @@ +#ifndef LEGOEXTRAACTOR_H +#define LEGOEXTRAACTOR_H + +#include "legoanimactor.h" + +// VTABLE 0x100d6c10 +class LegoExtraActor : public LegoAnimActor +{ +public: + // OFFSET: LEGO1 0x1002b7a0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f3204 + return "LegoExtraActor"; + } + + // OFFSET: LEGO1 0x1002b7c0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoExtraActor::ClassName()) || LegoAnimActor::IsA(name); + } +}; + +#endif // LEGOEXTRAACTOR_H diff --git a/LEGO1/legoflctexturepresenter.cpp b/LEGO1/legoflctexturepresenter.cpp new file mode 100644 index 00000000..d7a97d21 --- /dev/null +++ b/LEGO1/legoflctexturepresenter.cpp @@ -0,0 +1,7 @@ +#include "legoflctexturepresenter.h" + +// OFFSET: LEGO1 0x1005de80 STUB +LegoFlcTexturePresenter::LegoFlcTexturePresenter() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/legoflctexturepresenter.h b/LEGO1/legoflctexturepresenter.h new file mode 100644 index 00000000..e525b3ce --- /dev/null +++ b/LEGO1/legoflctexturepresenter.h @@ -0,0 +1,22 @@ +#ifndef LEGOFLCTEXTUREPRESENTER_H +#define LEGOFLCTEXTUREPRESENTER_H + +#include "mxflcpresenter.h" + +// VTABLE 0x100d89e0 +// SIZE 0x70 +class LegoFlcTexturePresenter : public MxFlcPresenter +{ +public: + LegoFlcTexturePresenter(); + + // OFFSET: LEGO1 0x1005def0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f0634 + return "LegoFlcTexturePresenter"; + } + +}; + +#endif // LEGOFLCTEXTUREPRESENTER_H diff --git a/LEGO1/legohideanimpresenter.cpp b/LEGO1/legohideanimpresenter.cpp new file mode 100644 index 00000000..8a9e7c9b --- /dev/null +++ b/LEGO1/legohideanimpresenter.cpp @@ -0,0 +1,12 @@ +#include "legohideanimpresenter.h" + +// OFFSET: LEGO1 0x1006d7e0 +LegoHideAnimPresenter::LegoHideAnimPresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x1006da50 STUB +void LegoHideAnimPresenter::Init() +{ +} diff --git a/LEGO1/legohideanimpresenter.h b/LEGO1/legohideanimpresenter.h new file mode 100644 index 00000000..0c078e9b --- /dev/null +++ b/LEGO1/legohideanimpresenter.h @@ -0,0 +1,31 @@ +#ifndef LEGOHIDEANIMPRESENTER_H +#define LEGOHIDEANIMPRESENTER_H + +#include "legoloopinganimpresenter.h" + +// VTABLE 0x100d9278 +// SIZE 0xc4 +class LegoHideAnimPresenter : public LegoLoopingAnimPresenter +{ +public: + LegoHideAnimPresenter(); + + // OFFSET: LEGO1 0x1006d880 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f06cc + return "LegoHideAnimPresenter"; + } + + // OFFSET: LEGO1 0x1006d890 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoHideAnimPresenter::ClassName()) || LegoAnimPresenter::IsA(name); + } + +private: + void Init(); + +}; + +#endif // LEGOHIDEANIMPRESENTER_H diff --git a/LEGO1/legoinputmanager.cpp b/LEGO1/legoinputmanager.cpp new file mode 100644 index 00000000..d60f5fc7 --- /dev/null +++ b/LEGO1/legoinputmanager.cpp @@ -0,0 +1,22 @@ +#include "legoinputmanager.h" + +// OFFSET: LEGO1 0x1005b790 STUB +LegoInputManager::LegoInputManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1005b8f0 STUB +LegoInputManager::~LegoInputManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1005b8b0 STUB +long LegoInputManager::Tickle() +{ + // TODO + + return 0; +} + diff --git a/LEGO1/legoinputmanager.h b/LEGO1/legoinputmanager.h index bc5cc4d3..caafed52 100644 --- a/LEGO1/legoinputmanager.h +++ b/LEGO1/legoinputmanager.h @@ -13,13 +13,20 @@ __declspec(dllexport) enum NotificationId TIMER = 15 }; +// VTABLE 0x100d8760 +// SIZE 0x338 class LegoInputManager { public: + LegoInputManager(); + virtual ~LegoInputManager() override; + __declspec(dllexport) void QueueEvent(NotificationId id, unsigned char p2, long p3, long p4, unsigned char p5); __declspec(dllexport) void Register(MxCore *); __declspec(dllexport) void UnRegister(MxCore *); + virtual long Tickle() override; // vtable+0x8 + char m_pad00[0x19C]; int m_joystickIndex; char m_pad200[0x194]; diff --git a/LEGO1/legojetski.cpp b/LEGO1/legojetski.cpp new file mode 100644 index 00000000..d0fffd85 --- /dev/null +++ b/LEGO1/legojetski.cpp @@ -0,0 +1 @@ +#include "legojetski.h" diff --git a/LEGO1/legojetski.h b/LEGO1/legojetski.h new file mode 100644 index 00000000..759e83ac --- /dev/null +++ b/LEGO1/legojetski.h @@ -0,0 +1,26 @@ +#ifndef LEGOJETSKI_H +#define LEGOJETSKI_H + +#include "legojetskiraceactor.h" + +// VTABLE 0x100d5a40 +class LegoJetski : public LegoJetskiRaceActor +{ +public: + // OFFSET: LEGO1 0x10013e80 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f053c + return "LegoJetski"; + } + + // OFFSET: LEGO1 0x10013ea0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoJetski::ClassName()) || LegoJetskiRaceActor::IsA(name); + } + +}; + + +#endif // LEGOJETSKI_H diff --git a/LEGO1/legojetskiraceactor.h b/LEGO1/legojetskiraceactor.h new file mode 100644 index 00000000..7c31f3b2 --- /dev/null +++ b/LEGO1/legojetskiraceactor.h @@ -0,0 +1,24 @@ +#ifndef LEGOJETSKIRACEACTOR_H +#define LEGOJETSKIRACEACTOR_H + +#include "legocarraceactor.h" + +// VTABLE 0x100da240 +class LegoJetskiRaceActor : public LegoCarRaceActor +{ +public: + // OFFSET: LEGO1 0x10081d80 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f0554 + return "LegoJetskiRaceActor"; + } + + // OFFSET: LEGO1 0x10081da0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoJetskiRaceActor::ClassName()) || LegoCarRaceActor::IsA(name); + } +}; + +#endif // LEGOJETSKIRACEACTOR_H diff --git a/LEGO1/legoloadcachesoundpresenter.cpp b/LEGO1/legoloadcachesoundpresenter.cpp new file mode 100644 index 00000000..0830d7d7 --- /dev/null +++ b/LEGO1/legoloadcachesoundpresenter.cpp @@ -0,0 +1,19 @@ +#include "legoloadcachesoundpresenter.h" + +// OFFSET: LEGO1 0x10018340 +LegoLoadCacheSoundPresenter::LegoLoadCacheSoundPresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x10018480 STUB +LegoLoadCacheSoundPresenter::~LegoLoadCacheSoundPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100184e0 STUB +void LegoLoadCacheSoundPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/legoloadcachesoundpresenter.h b/LEGO1/legoloadcachesoundpresenter.h new file mode 100644 index 00000000..0673568e --- /dev/null +++ b/LEGO1/legoloadcachesoundpresenter.h @@ -0,0 +1,26 @@ +#ifndef LEGOLOADCACHESOUNDPRESENTER_H +#define LEGOLOADCACHESOUNDPRESENTER_H + +#include "mxwavepresenter.h" + +// VTABLE 0x100d5fa8 +// SIZE 0x90 +class LegoLoadCacheSoundPresenter : public MxWavePresenter +{ +public: + LegoLoadCacheSoundPresenter(); + virtual ~LegoLoadCacheSoundPresenter() override; + + // OFFSET: LEGO1 0x10018450 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f05a0 + return "LegoLoadCacheSoundPresenter"; + } + +private: + void Init(); + +}; + +#endif // LEGOLOADCACHESOUNDPRESENTER_H diff --git a/LEGO1/legolocomotionanimpresenter.cpp b/LEGO1/legolocomotionanimpresenter.cpp new file mode 100644 index 00000000..f7da593f --- /dev/null +++ b/LEGO1/legolocomotionanimpresenter.cpp @@ -0,0 +1,13 @@ +#include "legolocomotionanimpresenter.h" + +// OFFSET: LEGO1 0x1006cdd0 +LegoLocomotionAnimPresenter::LegoLocomotionAnimPresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x1006d0b0 STUB +void LegoLocomotionAnimPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/legolocomotionanimpresenter.h b/LEGO1/legolocomotionanimpresenter.h new file mode 100644 index 00000000..b5906ca6 --- /dev/null +++ b/LEGO1/legolocomotionanimpresenter.h @@ -0,0 +1,30 @@ +#ifndef LEGOLOCOMOTIONANIMPRESENTER_H +#define LEGOLOCOMOTIONANIMPRESENTER_H + +#include "legoloopinganimpresenter.h" + +// VTABLE 0x100d9170 +class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter +{ +public: + LegoLocomotionAnimPresenter(); + + // OFFSET: LEGO1 0x1006ce50 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f06e4 + return "LegoLocomotionAnimPresenter"; + } + + // OFFSET: LEGO1 0x1006ce60 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoLocomotionAnimPresenter::ClassName()) || LegoLoopingAnimPresenter::IsA(name); + } + +private: + void Init(); + +}; + +#endif // LEGOLOCOMOTIONANIMPRESENTER_H diff --git a/LEGO1/legoloopinganimpresenter.h b/LEGO1/legoloopinganimpresenter.h new file mode 100644 index 00000000..6e4a5eb1 --- /dev/null +++ b/LEGO1/legoloopinganimpresenter.h @@ -0,0 +1,25 @@ +#ifndef LEGOLOOPINGANIMPRESENTER_H +#define LEGOLOOPINGANIMPRESENTER_H + +#include "legoanimpresenter.h" + +// VTABLE 0x100d4900 +// SIZE 0xc0 (discovered through inlined constructor at 0x10009ecd) +class LegoLoopingAnimPresenter : public LegoAnimPresenter +{ +public: + // OFFSET: LEGO1 0x1000c9a0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f0700 + return "LegoLoopingAnimPresenter"; + } + + // OFFSET: LEGO1 0x1000c9b0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoLoopingAnimPresenter::ClassName()) || LegoAnimPresenter::IsA(name); + } +}; + +#endif // LEGOLOOPINGANIMPRESENTER_H diff --git a/LEGO1/legomodelpresenter.h b/LEGO1/legomodelpresenter.h index a5c6306c..e5f0d136 100644 --- a/LEGO1/legomodelpresenter.h +++ b/LEGO1/legomodelpresenter.h @@ -1,10 +1,27 @@ #ifndef LEGOMODELPRESENTER_H #define LEGOMODELPRESENTER_H -class LegoModelPresenter +#include "mxvideopresenter.h" + +// VTABLE 0x100d4e50 +// SIZE 0x6c (discovered through inline constructor at 0x10009ae6) +class LegoModelPresenter : public MxVideoPresenter { public: __declspec(dllexport) static void configureLegoModelPresenter(int param_1); + + // OFFSET: LEGO1 0x1000ccb0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f067c + return "LegoModelPresenter"; + } + + // OFFSET: LEGO1 0x1000ccc0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoModelPresenter::ClassName()) || MxVideoPresenter::IsA(name); + } }; #endif // LEGOMODELPRESENTER_H diff --git a/LEGO1/legonavcontroller.h b/LEGO1/legonavcontroller.h index 35bcf4d3..d2bf7df7 100644 --- a/LEGO1/legonavcontroller.h +++ b/LEGO1/legonavcontroller.h @@ -5,6 +5,8 @@ #include "mxtimer.h" #include "mxtypes.h" +// VTABLE 0x100d85b8 +// SIZE 0x70 class LegoNavController : public MxCore { public: @@ -18,7 +20,20 @@ class LegoNavController : public MxCore float p_rotationSensitivity, MxBool p_turnUseVelocity); LegoNavController(); - // virtual ~LegoNavController(); + // virtual ~LegoNavController(); // vtable+0x0 + + // OFFSET: LEGO1 0x10054b80 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f66d8 + return "LegoNavController"; + } + + // OFFSET: LEGO1 0x10054b90 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoNavController::ClassName()) || MxCore::IsA(name); + } void SetControlMax(int p_hMax, int p_vMax); void ResetToDefault(); diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 3d8be0d7..0d1abaf1 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -37,6 +37,24 @@ LegoVideoManager *VideoManager() return LegoOmni::GetInstance()->GetVideoManager(); } +// OFFSET: LEGO1 0x100157f0 +LegoBuildingManager *BuildingManager() +{ + return LegoOmni::GetInstance()->GetLegoBuildingManager(); +} + +// OFFSET: LEGO1 0x10015790 +Isle *GetIsle() +{ + return LegoOmni::GetInstance()->GetIsle(); +} + +// OFFSET: LEGO1 0x100157e0 +LegoPlantManager *PlantManager() +{ + return LegoOmni::GetInstance()->GetLegoPlantManager(); +} + // OFFSET: LEGO1 0x10015730 MxBackgroundAudioManager *BackgroundAudioManager() { diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 852c5b07..40804cbf 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -14,9 +14,14 @@ #include "mxdsobject.h" #include "mxomni.h" #include "mxtransitionmanager.h" +#include "isle.h" +#include "legobuildingmanager.h" +#include "legoplantmanager.h" class LegoSoundManager; +// VTABLE 0x100d8638 +// SIZE: 0x140 class LegoOmni : public MxOmni { public: @@ -32,10 +37,17 @@ class LegoOmni : public MxOmni virtual long Notify(MxParam &p); // vtable+04 // OFFSET: LEGO1 0x10058aa0 - inline virtual const char *ClassName() const { return "LegoOmni"; }; // vtable+0c + inline virtual const char *ClassName() const // vtable+0c + { + // 0x100f671c + return "LegoOmni"; + } // OFFSET: LEGO1 0x10058ab0 - inline virtual MxBool IsA(const char *name) const { return !strcmp(name, LegoOmni::ClassName()) || MxOmni::IsA(name); }; // vtable+10; + inline virtual MxBool IsA(const char *name) const // vtable+10 + { + return !strcmp(name, LegoOmni::ClassName()) || MxOmni::IsA(name); + } virtual void Init(); // vtable+14 virtual MxResult Create(MxOmniCreateParam &p); // vtable+18 @@ -54,6 +66,9 @@ class LegoOmni : public MxOmni LegoSoundManager *GetSoundManager() { return (LegoSoundManager *)m_soundManager;} MxBackgroundAudioManager *GetBackgroundAudioManager() { return m_bkgAudioManager; } LegoInputManager *GetInputManager() { return m_inputMgr; } + Isle *GetIsle() { return m_isle; } + LegoBuildingManager *GetLegoBuildingManager() { return m_buildingManager; } + LegoPlantManager *GetLegoPlantManager() { return m_plantManager; } LegoGameState *GetGameState() { return m_gameState; } LegoNavController *GetNavController() { return m_navController; } @@ -63,11 +78,16 @@ class LegoOmni : public MxOmni LegoInputManager *m_inputMgr; // 0x70 char m_unk74[0x10]; LegoNavController *m_navController; // 0x84 - char m_unk88[0x14]; + Isle* m_isle; // 0x88 + char m_unk8c[0x4]; + LegoPlantManager* m_plantManager; // 0x90 + char m_unk94[0x4]; + LegoBuildingManager* m_buildingManager; // 0x98 LegoGameState *m_gameState; // 0x9c char m_unka0[0x94]; MxBackgroundAudioManager *m_bkgAudioManager; // 0x134 MxTransitionManager *m_transitionManager; // 0x138 + int m_unk13c; }; @@ -95,4 +115,8 @@ __declspec(dllexport) LegoVideoManager * VideoManager(); __declspec(dllexport) long Start(MxDSAction *a); +LegoBuildingManager* BuildingManager(); +Isle* GetIsle(); +LegoPlantManager* PlantManager(); + #endif // LEGOOMNI_H diff --git a/LEGO1/legopalettepresenter.cpp b/LEGO1/legopalettepresenter.cpp new file mode 100644 index 00000000..07b9cb99 --- /dev/null +++ b/LEGO1/legopalettepresenter.cpp @@ -0,0 +1,19 @@ +#include "legopalettepresenter.h" + +// OFFSET: LEGO1 0x10079e50 +LegoPalettePresenter::LegoPalettePresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x1007a070 STUB +LegoPalettePresenter::~LegoPalettePresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x1007a0d0 STUB +void LegoPalettePresenter::Init() +{ + // TODO +} diff --git a/LEGO1/legopalettepresenter.h b/LEGO1/legopalettepresenter.h new file mode 100644 index 00000000..bb1b116e --- /dev/null +++ b/LEGO1/legopalettepresenter.h @@ -0,0 +1,33 @@ +#ifndef LEGOPALETTEPRESENTER_H +#define LEGOPALETTEPRESENTER_H + +#include "mxvideopresenter.h" + +// VTABLE 0x100d9aa0 +// SIZE 0x68 +class LegoPalettePresenter : public MxVideoPresenter +{ +public: + LegoPalettePresenter(); + virtual ~LegoPalettePresenter(); // vtable+0x0 + + // OFFSET: LEGO1 0x10079f30 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f061c + return "LegoPalettePresenter"; + } + + // OFFSET: LEGO1 0x10079f40 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoPalettePresenter::ClassName()) || MxVideoPresenter::IsA(name); + } + +private: + void Init(); + +}; + + +#endif // LEGOPALETTEPRESENTER_H diff --git a/LEGO1/legopartpresenter.h b/LEGO1/legopartpresenter.h index 05e0df7e..6a9a91a5 100644 --- a/LEGO1/legopartpresenter.h +++ b/LEGO1/legopartpresenter.h @@ -1,9 +1,24 @@ #ifndef LEGOPARTPRESENTER_H #define LEGOPARTPRESENTER_H -class LegoPartPresenter +// VTABLE 0x100d4df0 +// SIZE 0x54 (from inlined construction at 0x10009fac) +class LegoPartPresenter : public MxMediaPresenter { public: + // OFFSET: LEGO1 0x1000cf70 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f05d8 + return "LegoPartPresenter"; + } + + // OFFSET: LEGO1 0x1000cf80 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoPartPresenter::ClassName()) || MxMediaPresenter::IsA(name); + } + __declspec(dllexport) static void configureLegoPartPresenter(int param_1, int param_2); }; diff --git a/LEGO1/legopathactor.cpp b/LEGO1/legopathactor.cpp new file mode 100644 index 00000000..336cdc13 --- /dev/null +++ b/LEGO1/legopathactor.cpp @@ -0,0 +1,13 @@ +#include "legopathactor.h" + +// OFFSET: LEGO1 0x1002d700 STUB +LegoPathActor::LegoPathActor() +{ + // TODO +} + +// OFFSET: LEGO1 0x1002d820 STUB +LegoPathActor::~LegoPathActor() +{ + // TODO +} diff --git a/LEGO1/legopathactor.h b/LEGO1/legopathactor.h new file mode 100644 index 00000000..e6f643c2 --- /dev/null +++ b/LEGO1/legopathactor.h @@ -0,0 +1,30 @@ +#ifndef LEGOPATHACTOR_H +#define LEGOPATHACTOR_H + +#include "legoactor.h" + +// VTABLE 0x100d6e28 +// SIZE 0x154 (from inlined construction at 0x1000a346) +class LegoPathActor : public LegoActor +{ +public: + LegoPathActor(); + + virtual ~LegoPathActor() override; + + // OFFSET: LEGO1 0x1000c430 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f0114 + return "LegoPathActor"; + } + + // OFFSET: LEGO1 0x1000c440 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoPathActor::ClassName()) || LegoActor::IsA(name); + } + +}; + +#endif // LEGOPATHACTOR_H diff --git a/LEGO1/legopathcontroller.cpp b/LEGO1/legopathcontroller.cpp new file mode 100644 index 00000000..46e23f5e --- /dev/null +++ b/LEGO1/legopathcontroller.cpp @@ -0,0 +1,20 @@ +#include "legopathcontroller.h" + +// OFFSET: LEGO1 0x10044f40 STUB +LegoPathController::LegoPathController() +{ + // TODO +} + +// OFFSET: LEGO1 0x10045740 STUB +LegoPathController::~LegoPathController() +{ + // TODO +} + +// OFFSET: LEGO1 0x10045c10 STUB +long LegoPathController::Tickle() +{ + // TODO + return 0; +} diff --git a/LEGO1/legopathcontroller.h b/LEGO1/legopathcontroller.h new file mode 100644 index 00000000..9686b2bd --- /dev/null +++ b/LEGO1/legopathcontroller.h @@ -0,0 +1,31 @@ +#ifndef LEGOPATHCONTROLLER_H +#define LEGOPATHCONTROLLER_H + +#include "mxcore.h" + +// VTABLE 0x100d7d60 +// SIZE 0x40 +class LegoPathController : public MxCore +{ +public: + LegoPathController(); + virtual ~LegoPathController() override; + + virtual long Tickle() override; // vtable+08 + + // OFFSET: LEGO1 0x10045110 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f11b8 + return "LegoPathController"; + } + + // OFFSET: LEGO1 0x10045120 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoPathController::ClassName()) || MxCore::IsA(name); + } + +}; + +#endif // LEGOPATHCONTROLLER_H diff --git a/LEGO1/legopathpresenter.cpp b/LEGO1/legopathpresenter.cpp new file mode 100644 index 00000000..43b05e26 --- /dev/null +++ b/LEGO1/legopathpresenter.cpp @@ -0,0 +1,7 @@ +#include "legopathpresenter.h" + +// OFFSET: LEGO1 0x100448d0 STUB +LegoPathPresenter::LegoPathPresenter() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/legopathpresenter.h b/LEGO1/legopathpresenter.h new file mode 100644 index 00000000..225f4256 --- /dev/null +++ b/LEGO1/legopathpresenter.h @@ -0,0 +1,29 @@ +#ifndef LEGOPATHPRESENTER_H +#define LEGOPATHPRESENTER_H + +#include "mxmediapresenter.h" + +// VTABLE 0x100d7c10 +// SIZE 0x54 +class LegoPathPresenter : public MxMediaPresenter +{ +public: + LegoPathPresenter(); + + // OFFSET: LEGO1 0x100449a0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f0690 + return "LegoPathPresenter"; + } + + // OFFSET: LEGO1 0x100449b0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoPathPresenter::ClassName()) || MxMediaPresenter::IsA(name); + } + +}; + + +#endif // LEGOPATHPRESENTER_H diff --git a/LEGO1/legophonemepresenter.cpp b/LEGO1/legophonemepresenter.cpp new file mode 100644 index 00000000..43948fc7 --- /dev/null +++ b/LEGO1/legophonemepresenter.cpp @@ -0,0 +1,19 @@ +#include "legophonemepresenter.h" + +// OFFSET: LEGO1 0x1004e180 +LegoPhonemePresenter::LegoPhonemePresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x1004e3b0 STUB +void LegoPhonemePresenter::Init() +{ + // TODO +} + +// OFFSET: LEGO1 0x1004e340 STUB +LegoPhonemePresenter::~LegoPhonemePresenter() +{ + // TODO +} diff --git a/LEGO1/legophonemepresenter.h b/LEGO1/legophonemepresenter.h new file mode 100644 index 00000000..c2616448 --- /dev/null +++ b/LEGO1/legophonemepresenter.h @@ -0,0 +1,26 @@ +#ifndef LEGOPHONEMEPRESENTER_H +#define LEGOPHONEMEPRESENTER_H + +#include "mxflcpresenter.h" + +// VTABLE 0x100d8040 +// SIZE 0x88 +class LegoPhonemePresenter : public MxFlcPresenter +{ +public: + LegoPhonemePresenter(); + virtual ~LegoPhonemePresenter() override; // vtable+0x0 + + // OFFSET: LEGO1 0x1004e310 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f064c + return "LegoPhonemePresenter"; + } + +private: + void Init(); + +}; + +#endif // LEGOPHONEMEPRESENTER_H diff --git a/LEGO1/legoplantmanager.cpp b/LEGO1/legoplantmanager.cpp new file mode 100644 index 00000000..8f67b939 --- /dev/null +++ b/LEGO1/legoplantmanager.cpp @@ -0,0 +1,27 @@ +#include "legoplantmanager.h" + +// OFFSET: LEGO1 0x10026220 +LegoPlantManager::LegoPlantManager() +{ + Init(); +} + +// OFFSET: LEGO1 0x100262c0 STUB +LegoPlantManager::~LegoPlantManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x10026e00 STUB +long LegoPlantManager::Tickle() +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x10026330 STUB +void LegoPlantManager::Init() +{ + // TODO +} diff --git a/LEGO1/legoplantmanager.h b/LEGO1/legoplantmanager.h new file mode 100644 index 00000000..272fb451 --- /dev/null +++ b/LEGO1/legoplantmanager.h @@ -0,0 +1,28 @@ +#ifndef LEGOPLANTMANAGER_H +#define LEGOPLANTMANAGER_H + +#include "mxcore.h" + +// VTABLE 0x100d6758 +// SIZE 0x2c +class LegoPlantManager : public MxCore +{ +public: + LegoPlantManager(); + virtual ~LegoPlantManager() override; // vtable+0x0 + + virtual long Tickle() override; // vtable+0x8 + + // OFFSET: LEGO1 0x10026290 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f318c + return "LegoPlantManager"; + } + +private: + void Init(); + +}; + +#endif // LEGOPLANTMANAGER_H diff --git a/LEGO1/legorace.cpp b/LEGO1/legorace.cpp new file mode 100644 index 00000000..888b1fe1 --- /dev/null +++ b/LEGO1/legorace.cpp @@ -0,0 +1,21 @@ +#include "legorace.h" + +// OFFSET: LEGO1 0x10015aa0 STUB +LegoRace::LegoRace() +{ + // TODO +} + +// OFFSET: LEGO1 0x10015d40 STUB +LegoRace::~LegoRace() +{ + // TODO +} + +// OFFSET: LEGO1 0x10015e00 STUB +long LegoRace::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/legorace.h b/LEGO1/legorace.h new file mode 100644 index 00000000..003e57ed --- /dev/null +++ b/LEGO1/legorace.h @@ -0,0 +1,29 @@ +#ifndef LEGORACE_H +#define LEGORACE_H + +#include "legoworld.h" + +// VTABLE 0x100d5db0 +class LegoRace : public LegoWorld +{ +public: + LegoRace(); + virtual ~LegoRace() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + + // OFFSET: LEGO1 0x10015ba0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f07c4 + return "LegoRace"; + } + + // OFFSET: LEGO1 0x10015bb0 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoRace::ClassName()) || LegoWorld::IsA(name); + } +}; + +#endif // LEGORACE_H diff --git a/LEGO1/legoraceactor.h b/LEGO1/legoraceactor.h new file mode 100644 index 00000000..d7908063 --- /dev/null +++ b/LEGO1/legoraceactor.h @@ -0,0 +1,25 @@ +#ifndef LEGORACEACTOR_H +#define LEGORACEACTOR_H + +#include "legoanimactor.h" + +// VTABLE 0x100d5b88 +class LegoRaceActor : public LegoAnimActor +{ +public: + // OFFSET: LEGO1 0x10014af0 + inline const char *ClassName() const override // vtable+0xc + { + // 0x100f0bf4 + return "LegoRaceActor"; + } + + // OFFSET: LEGO1 0x10014b10 + inline MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoRaceActor::ClassName()) || LegoAnimActor::IsA(name); + } +}; + + +#endif // LEGORACEACTOR_H diff --git a/LEGO1/legosoundmanager.cpp b/LEGO1/legosoundmanager.cpp new file mode 100644 index 00000000..518b8c55 --- /dev/null +++ b/LEGO1/legosoundmanager.cpp @@ -0,0 +1,20 @@ +#include "legosoundmanager.h" + +// OFFSET: LEGO1 0x100298a0 STUB +LegoSoundManager::LegoSoundManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x10029940 STUB +LegoSoundManager::~LegoSoundManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1002a3a0 STUB +long LegoSoundManager::Tickle() +{ + // TODO + return 0; +} diff --git a/LEGO1/legosoundmanager.h b/LEGO1/legosoundmanager.h new file mode 100644 index 00000000..9b1e6450 --- /dev/null +++ b/LEGO1/legosoundmanager.h @@ -0,0 +1,20 @@ +#ifndef LEGOSOUNDMANAGER_H +#define LEGOSOUNDMANAGER_H + +#include "mxsoundmanager.h" + +// VTABLE 0x100d6b10 +// SIZE 0x44 +class LegoSoundManager : public MxSoundManager +{ +public: + LegoSoundManager(); + virtual ~LegoSoundManager() override; + virtual long Tickle() override; // vtable+08 + +private: + void Init(); + +}; + +#endif // LEGOSOUNDMANAGER_H diff --git a/LEGO1/legostate.cpp b/LEGO1/legostate.cpp new file mode 100644 index 00000000..2b49fcd7 --- /dev/null +++ b/LEGO1/legostate.cpp @@ -0,0 +1,6 @@ +#include "legostate.h" + +// OFFSET: LEGO1 0x10005f40 +LegoState::~LegoState() +{ +} diff --git a/LEGO1/legostate.h b/LEGO1/legostate.h new file mode 100644 index 00000000..be7289bc --- /dev/null +++ b/LEGO1/legostate.h @@ -0,0 +1,27 @@ +#ifndef LEGOSTATE_H +#define LEGOSTATE_H + +#include "mxcore.h" + +// VTABLE 0x100d46c0 +class LegoState : public MxCore +{ +public: + virtual ~LegoState() override; // vtable+0x00 + + // OFFSET: LEGO1 0x100060d0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f01b8 + return "LegoState"; + } + + // OFFSET: LEGO1 0x100060e0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoState::ClassName()) || MxCore::IsA(name); + } + +}; + +#endif // LEGOSTATE_H diff --git a/LEGO1/legotexturepresenter.cpp b/LEGO1/legotexturepresenter.cpp new file mode 100644 index 00000000..2336a724 --- /dev/null +++ b/LEGO1/legotexturepresenter.cpp @@ -0,0 +1,7 @@ +#include "legotexturepresenter.h" + +// OFFSET: LEGO1 0x1004eb40 STUB +LegoTexturePresenter::~LegoTexturePresenter() +{ + // TODO +} diff --git a/LEGO1/legotexturepresenter.h b/LEGO1/legotexturepresenter.h new file mode 100644 index 00000000..eabd4895 --- /dev/null +++ b/LEGO1/legotexturepresenter.h @@ -0,0 +1,28 @@ +#ifndef LEGOTEXTUREPRESENTER_H +#define LEGOTEXTUREPRESENTER_H + +#include "mxmediapresenter.h" + +// VTABLE 0x100d4d90 +// SIZE 0x54 (from inlined construction at 0x10009bb5) +class LegoTexturePresenter : public MxMediaPresenter +{ +public: + virtual ~LegoTexturePresenter() override; + + // OFFSET: LEGO1 0x1000ce50 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0664 + return "LegoTexturePresenter"; + } + + // OFFSET: LEGO1 0x1000ce60 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoTexturePresenter::ClassName()) || MxMediaPresenter::IsA(name); + } + +}; + +#endif // LEGOTEXTUREPRESENTER_H diff --git a/LEGO1/legoutil.h b/LEGO1/legoutil.h index 440b01d0..e94a6440 100644 --- a/LEGO1/legoutil.h +++ b/LEGO1/legoutil.h @@ -4,7 +4,7 @@ template inline T Abs(T p_t) { - return p_t < 0 ? -p_t : p_t; + return p_t < 0 ? -p_t : p_t; } -#endif // LEGOUTIL_H \ No newline at end of file +#endif // LEGOUTIL_H diff --git a/LEGO1/legovideomanager.cpp b/LEGO1/legovideomanager.cpp new file mode 100644 index 00000000..060cc61f --- /dev/null +++ b/LEGO1/legovideomanager.cpp @@ -0,0 +1,39 @@ +#include "legovideomanager.h" + +// OFFSET: LEGO1 0x1007aa20 STUB +LegoVideoManager::LegoVideoManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1007ab40 STUB +LegoVideoManager::~LegoVideoManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1007c560 STUB +int LegoVideoManager::EnableRMDevice() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1007c740 STUB +int LegoVideoManager::DisableRMDevice() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1007c310 STUB +void LegoVideoManager::EnableFullScreenMovie(unsigned char a, unsigned char b) +{ + // TODO +} + +// OFFSET: LEGO1 0x1007b6a0 STUB +void LegoVideoManager::MoveCursor(int x, int y) +{ + // TODO +} diff --git a/LEGO1/legovideomanager.h b/LEGO1/legovideomanager.h index d96fac87..ec1aa6fd 100644 --- a/LEGO1/legovideomanager.h +++ b/LEGO1/legovideomanager.h @@ -4,9 +4,14 @@ #include "mxvideomanager.h" #include "lego3dmanager.h" +// VTABLE 0x100d9c88 +// SIZE 0x590 class LegoVideoManager : public MxVideoManager { public: + LegoVideoManager(); + virtual ~LegoVideoManager() override; + __declspec(dllexport) int EnableRMDevice(); __declspec(dllexport) int DisableRMDevice(); __declspec(dllexport) void EnableFullScreenMovie(unsigned char a, unsigned char b); diff --git a/LEGO1/legoworld.cpp b/LEGO1/legoworld.cpp new file mode 100644 index 00000000..68009d43 --- /dev/null +++ b/LEGO1/legoworld.cpp @@ -0,0 +1,13 @@ +#include "legoworld.h" + +// OFFSET: LEGO1 0x1001ca40 STUB +LegoWorld::LegoWorld() +{ + // TODO +} + +// OFFSET: LEGO1 0x1001dfa0 STUB +LegoWorld::~LegoWorld() +{ + // TODO +} diff --git a/LEGO1/legoworld.h b/LEGO1/legoworld.h index b11f7095..d6170bfc 100644 --- a/LEGO1/legoworld.h +++ b/LEGO1/legoworld.h @@ -1,11 +1,28 @@ #ifndef LEGOWORLD_H #define LEGOWORLD_H -class LegoWorld +#include "legoentity.h" + +// VTABLE 0x100d6280 +// SIZE 0xf8 +class LegoWorld : public LegoEntity { public: __declspec(dllexport) LegoWorld(); - __declspec(dllexport) virtual ~LegoWorld(); + __declspec(dllexport) virtual ~LegoWorld(); // vtable+0x0 + + // OFFSET: LEGO1 0x1001d690 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0058 + return "LegoWorld"; + } + + // OFFSET: LEGO1 0x1001d6a0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoWorld::ClassName()) || LegoEntity::IsA(name); + } }; #endif // LEGOWORLD_H diff --git a/LEGO1/legoworldpresenter.cpp b/LEGO1/legoworldpresenter.cpp new file mode 100644 index 00000000..280d7a24 --- /dev/null +++ b/LEGO1/legoworldpresenter.cpp @@ -0,0 +1,19 @@ +#include "legoworldpresenter.h" + +// OFFSET: LEGO1 0x100665c0 STUB +LegoWorldPresenter::LegoWorldPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x10066770 STUB +LegoWorldPresenter::~LegoWorldPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100665b0 STUB +void LegoWorldPresenter::configureLegoWorldPresenter(int param_1) +{ + // TODO +} diff --git a/LEGO1/legoworldpresenter.h b/LEGO1/legoworldpresenter.h index 006b4cf8..b7f39ddb 100644 --- a/LEGO1/legoworldpresenter.h +++ b/LEGO1/legoworldpresenter.h @@ -1,10 +1,31 @@ #ifndef LEGOWORLDPRESENTER_H #define LEGOWORLDPRESENTER_H -class LegoWorldPresenter +#include "legoentitypresenter.h" + +// VTABLE 0x100d8ee0 +// SIZE 0x54 +class LegoWorldPresenter : public LegoEntityPresenter { public: + LegoWorldPresenter(); + virtual ~LegoWorldPresenter() override; // vtable+0x0 + __declspec(dllexport) static void configureLegoWorldPresenter(int param_1); + + // OFFSET: LEGO1 0x10066630 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0608 + return "LegoWorldPresenter"; + } + + // OFFSET: LEGO1 0x10066640 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoWorldPresenter::ClassName()) || LegoEntityPresenter::IsA(name); + } + }; #endif // LEGOWORLDPRESENTER_H diff --git a/LEGO1/motorcycle.cpp b/LEGO1/motorcycle.cpp new file mode 100644 index 00000000..9b0e0e40 --- /dev/null +++ b/LEGO1/motorcycle.cpp @@ -0,0 +1,7 @@ +#include "motorcycle.h" + +// OFFSET: LEGO1 0x100357b0 STUB +Motorcycle::Motorcycle() +{ + // TODO +} diff --git a/LEGO1/motorcycle.h b/LEGO1/motorcycle.h new file mode 100644 index 00000000..5ba746a8 --- /dev/null +++ b/LEGO1/motorcycle.h @@ -0,0 +1,28 @@ +#ifndef MOTORCYCLE_H +#define MOTORCYCLE_H + +#include "islepathactor.h" + +// VTABLE 0x100d7090 +// SIZE 0x16c +class Motorcycle : public IslePathActor +{ +public: + Motorcycle(); + + // OFFSET: LEGO1 0x10035840 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10035840 + return "Motorcycle"; + } + + // OFFSET: LEGO1 0x10035850 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, Motorcycle::ClassName()) || IslePathActor::IsA(name); + } + +}; + +#endif // MOTORCYCLE_H diff --git a/LEGO1/mxatomid.cpp b/LEGO1/mxatomid.cpp index f2171360..007e2de3 100644 --- a/LEGO1/mxatomid.cpp +++ b/LEGO1/mxatomid.cpp @@ -1,5 +1,11 @@ #include "mxatomid.h" +// OFFSET: LEGO1 0x100acf90 +MxAtomId::MxAtomId(const char *, LookupMode) +{ + // TODO +} + // OFFSET: LEGO1 0x100acfd0 MxAtomId::~MxAtomId() { @@ -11,4 +17,4 @@ MxAtomId &MxAtomId::operator=(const MxAtomId &id) { // TODO return *this; -} \ No newline at end of file +} diff --git a/LEGO1/mxatomid.h b/LEGO1/mxatomid.h index b28704c0..9a218a1b 100644 --- a/LEGO1/mxatomid.h +++ b/LEGO1/mxatomid.h @@ -15,7 +15,7 @@ class MxAtomId MxAtomId() { this->m_internal = 0; - }; + } private: char *m_internal; diff --git a/LEGO1/mxaudiopresenter.cpp b/LEGO1/mxaudiopresenter.cpp new file mode 100644 index 00000000..b15c2556 --- /dev/null +++ b/LEGO1/mxaudiopresenter.cpp @@ -0,0 +1 @@ +#include "mxaudiopresenter.h" diff --git a/LEGO1/mxaudiopresenter.h b/LEGO1/mxaudiopresenter.h new file mode 100644 index 00000000..b23eefe9 --- /dev/null +++ b/LEGO1/mxaudiopresenter.h @@ -0,0 +1,24 @@ +#ifndef MXAUDIOPRESENTER_H +#define MXAUDIOPRESENTER_H + +#include "mxmediapresenter.h" + +// VTABLE 0x100d4c70 +class MxAudioPresenter : public MxMediaPresenter +{ +public: + // OFFSET: LEGO1 0x1000d280 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f078c + return "MxAudioPresenter"; + } + + // OFFSET: LEGO1 0x1000d290 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxAudioPresenter::ClassName()) || MxMediaPresenter::IsA(name); + } +}; + +#endif // MXAUDIOPRESENTER_H diff --git a/LEGO1/mxautolocker.h b/LEGO1/mxautolocker.h index a2ce6caa..35e32ff3 100644 --- a/LEGO1/mxautolocker.h +++ b/LEGO1/mxautolocker.h @@ -5,11 +5,11 @@ class MxAutoLocker { - public: - MxAutoLocker(MxCriticalSection* cs); - ~MxAutoLocker(); - private: - MxCriticalSection* m_criticalSection; +public: + MxAutoLocker(MxCriticalSection* cs); + ~MxAutoLocker(); +private: + MxCriticalSection* m_criticalSection; }; #endif // MXAUTOLOCKER_H diff --git a/LEGO1/mxbackgroundaudiomanager.cpp b/LEGO1/mxbackgroundaudiomanager.cpp new file mode 100644 index 00000000..6f001303 --- /dev/null +++ b/LEGO1/mxbackgroundaudiomanager.cpp @@ -0,0 +1,19 @@ +#include "mxbackgroundaudiomanager.h" + +// OFFSET: LEGO1 0x1007ea90 +MxBackgroundAudioManager::MxBackgroundAudioManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1007ec20 +MxBackgroundAudioManager::~MxBackgroundAudioManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1007f5f0 +void MxBackgroundAudioManager::Enable(MxBool p) +{ + // TODO +} diff --git a/LEGO1/mxbackgroundaudiomanager.h b/LEGO1/mxbackgroundaudiomanager.h index 765fc9c3..9a23a671 100644 --- a/LEGO1/mxbackgroundaudiomanager.h +++ b/LEGO1/mxbackgroundaudiomanager.h @@ -1,9 +1,29 @@ #ifndef MXBACKGROUNDAUDIOMANAGER_H #define MXBACKGROUNDAUDIOMANAGER_H -class MxBackgroundAudioManager +#include "mxcore.h" + +// VTABLE 0x100d9fe8 +// SIZE 0x150 +class MxBackgroundAudioManager : public MxCore { public: + MxBackgroundAudioManager(); + virtual ~MxBackgroundAudioManager() override; + + // OFFSET: LEGO1 0x1007eb70 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f7ac4 + return "MxBackgroundAudioManager"; + } + + // OFFSET: LEGO1 0x1007eb80 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxBackgroundAudioManager::ClassName()) || MxCore::IsA(name); + } + __declspec(dllexport) void Enable(unsigned char p); }; diff --git a/LEGO1/mxcompositemediapresenter.cpp b/LEGO1/mxcompositemediapresenter.cpp new file mode 100644 index 00000000..581df06a --- /dev/null +++ b/LEGO1/mxcompositemediapresenter.cpp @@ -0,0 +1,7 @@ +#include "mxcompositemediapresenter.h" + +// OFFSET: LEGO1 0x10073ea0 STUB +MxCompositeMediaPresenter::MxCompositeMediaPresenter() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/mxcompositemediapresenter.h b/LEGO1/mxcompositemediapresenter.h new file mode 100644 index 00000000..1f464f4d --- /dev/null +++ b/LEGO1/mxcompositemediapresenter.h @@ -0,0 +1,28 @@ +#ifndef MXCOMPOSITEMEDIAPRESENTER_H +#define MXCOMPOSITEMEDIAPRESENTER_H + +#include "mxcompositepresenter.h" + +// VTABLE 0x100dc618 +// SIZE 0x50 +class MxCompositeMediaPresenter : public MxCompositePresenter +{ +public: + MxCompositeMediaPresenter(); + + // OFFSET: LEGO1 0x10073f10 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f02d4 + return "MxCompositeMediaPresenter"; + } + + // OFFSET: LEGO1 0x10073f20 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxCompositeMediaPresenter::ClassName()) || MxCompositePresenter::IsA(name); + } + +}; + +#endif // MXCOMPOSITEMEDIAPRESENTER_H diff --git a/LEGO1/mxcompositepresenter.cpp b/LEGO1/mxcompositepresenter.cpp new file mode 100644 index 00000000..e42dbadb --- /dev/null +++ b/LEGO1/mxcompositepresenter.cpp @@ -0,0 +1,13 @@ +#include "mxcompositepresenter.h" + +// OFFSET: LEGO1 0x100b60b0 STUB +MxCompositePresenter::MxCompositePresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b6390 STUB +MxCompositePresenter::~MxCompositePresenter() +{ + // TODO +} diff --git a/LEGO1/mxcompositepresenter.h b/LEGO1/mxcompositepresenter.h new file mode 100644 index 00000000..471f3087 --- /dev/null +++ b/LEGO1/mxcompositepresenter.h @@ -0,0 +1,29 @@ +#ifndef MXCOMPOSITEPRESENTER_H +#define MXCOMPOSITEPRESENTER_H + +#include "mxpresenter.h" + +// VTABLE 0x100dc618 +// SIZE 0x4c +class MxCompositePresenter : public MxPresenter +{ +public: + MxCompositePresenter(); + virtual ~MxCompositePresenter() override; // vtable+0x0 + + // OFFSET: LEGO1 0x100b6210 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0774 + return "MxCompositePresenter"; + } + + // OFFSET: LEGO1 0x100b6220 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxCompositePresenter::ClassName()) || MxPresenter::IsA(name); + } + +}; + +#endif // MXCOMPOSITEPRESENTER_H diff --git a/LEGO1/mxcontrolpresenter.cpp b/LEGO1/mxcontrolpresenter.cpp new file mode 100644 index 00000000..e9e10ef8 --- /dev/null +++ b/LEGO1/mxcontrolpresenter.cpp @@ -0,0 +1,7 @@ +#include "mxcontrolpresenter.h" + +// OFFSET: LEGO1 0x10043f50 STUB +MxControlPresenter::MxControlPresenter() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/mxcontrolpresenter.h b/LEGO1/mxcontrolpresenter.h new file mode 100644 index 00000000..909a3502 --- /dev/null +++ b/LEGO1/mxcontrolpresenter.h @@ -0,0 +1,29 @@ +#ifndef MXCONTROLPRESENTER_H +#define MXCONTROLPRESENTER_H + +#include "mxcompositepresenter.h" + +// VTABLE 0x100d7b88 +// SIZE 0x5c +class MxControlPresenter : public MxCompositePresenter +{ +public: + MxControlPresenter(); + + // OFFSET: LEGO1 0x10044000 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0514 + return "MxControlPresenter"; + } + + // OFFSET: LEGO1 0x10044010 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxControlPresenter::ClassName()) || MxCompositePresenter::IsA(name); + } + +}; + + +#endif // MXCONTROLPRESENTER_H diff --git a/LEGO1/mxcore.h b/LEGO1/mxcore.h index d870b3b3..446ee91e 100644 --- a/LEGO1/mxcore.h +++ b/LEGO1/mxcore.h @@ -7,6 +7,8 @@ class MxParam; +// VTABLE 0x100dc0f8 +// SIZE 0x8 class MxCore { public: @@ -16,10 +18,17 @@ class MxCore virtual long Tickle(); // vtable+08 // OFFSET: LEGO1 0x100144c0 - inline virtual const char *ClassName() const { return "MxCore"; }; // vtable+0c + inline virtual const char *ClassName() const // vtable+0c + { + // 0x100f007c + return "MxCore"; + } // OFFSET: LEGO1 0x100140d0 - inline virtual MxBool IsA(const char *name) const { return !strcmp(name, MxCore::ClassName()); }; // vtable+10 + inline virtual MxBool IsA(const char *name) const // vtable+10 + { + return !strcmp(name, MxCore::ClassName()); + } private: unsigned int m_id; diff --git a/LEGO1/mxdiskstreamcontroller.cpp b/LEGO1/mxdiskstreamcontroller.cpp new file mode 100644 index 00000000..c178c0a5 --- /dev/null +++ b/LEGO1/mxdiskstreamcontroller.cpp @@ -0,0 +1,21 @@ +#include "mxdiskstreamcontroller.h" + +// OFFSET: LEGO1 0x100c7120 STUB +MxDiskStreamController::MxDiskStreamController() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c7530 STUB +MxDiskStreamController::~MxDiskStreamController() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c8640 STUB +long MxDiskStreamController::Tickle() +{ + // TODO + + return 0; +} diff --git a/LEGO1/mxdiskstreamcontroller.h b/LEGO1/mxdiskstreamcontroller.h new file mode 100644 index 00000000..773f6b85 --- /dev/null +++ b/LEGO1/mxdiskstreamcontroller.h @@ -0,0 +1,34 @@ +#ifndef MXDISKSTREAMCONTROLLER_H +#define MXDISKSTREAMCONTROLLER_H + +#include + +#include "mxstreamcontroller.h" +#include "mxtypes.h" + +// VTABLE 0x100dccb8 +// SIZE 0xc8 +class MxDiskStreamController : public MxStreamController +{ +public: + MxDiskStreamController(); + virtual ~MxDiskStreamController() override; + + virtual long Tickle() override; // vtable+0x8 + + // OFFSET: LEGO1 0x100c7360 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10102144 + return "MxDiskStreamController"; + } + + // OFFSET: LEGO1 0x100c7370 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDiskStreamController::ClassName()) || MxStreamController::IsA(name); + } + +}; + +#endif // MXDISKSTREAMCONTROLLER_H diff --git a/LEGO1/mxdiskstreamprovider.cpp b/LEGO1/mxdiskstreamprovider.cpp new file mode 100644 index 00000000..5e59efee --- /dev/null +++ b/LEGO1/mxdiskstreamprovider.cpp @@ -0,0 +1,13 @@ +#include "mxdiskstreamprovider.h" + +// OFFSET: LEGO1 0x100d0f70 +MxDiskStreamProvider::MxDiskStreamProvider() +{ + // TODO +} + +// OFFSET: LEGO1 0x100d1240 +MxDiskStreamProvider::~MxDiskStreamProvider() +{ + // TODO +} diff --git a/LEGO1/mxdiskstreamprovider.h b/LEGO1/mxdiskstreamprovider.h new file mode 100644 index 00000000..198b6062 --- /dev/null +++ b/LEGO1/mxdiskstreamprovider.h @@ -0,0 +1,28 @@ +#ifndef MXDISKSTREAMPROVIDER_H +#define MXDISKSTREAMPROVIDER_H + +#include "mxstreamprovider.h" + +// VTABLE 0x100dd138 +class MxDiskStreamProvider : public MxStreamProvider +{ +public: + MxDiskStreamProvider(); + + virtual ~MxDiskStreamProvider() override; + + // OFFSET: LEGO1 0x100d1160 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x1010287c + return "MxDiskStreamProvider"; + } + + // OFFSET: LEGO1 0x100d1170 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDiskStreamProvider::ClassName()) || MxStreamProvider::IsA(name); + } +}; + +#endif // MXDISKSTREAMPROVIDER_H diff --git a/LEGO1/mxdsaction.cpp b/LEGO1/mxdsaction.cpp new file mode 100644 index 00000000..a193ab21 --- /dev/null +++ b/LEGO1/mxdsaction.cpp @@ -0,0 +1,13 @@ +#include "mxdsaction.h" + +// OFFSET: LEGO1 0x100ad810 +MxDSAction::MxDSAction() +{ + // TODO +} + +// OFFSET: LEGO1 0x100ada80 +MxDSAction::~MxDSAction() +{ + // TODO +} diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index 558cd035..e26d28a6 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -3,12 +3,27 @@ #include "mxdsobject.h" +// VTABLE 0x100dc098 +// SIZE 0x94 class MxDSAction : public MxDSObject { public: __declspec(dllexport) MxDSAction(); __declspec(dllexport) virtual ~MxDSAction(); + // OFFSET: LEGO1 0x100ad980 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x101013f4 + return "MxDSAction"; + } + + // OFFSET: LEGO1 0x100ad990 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSAction::ClassName()) || MxDSObject::IsA(name); + } + int m_unk2c; int m_unk30; int m_unk34; diff --git a/LEGO1/mxdsanim.cpp b/LEGO1/mxdsanim.cpp new file mode 100644 index 00000000..9a56d359 --- /dev/null +++ b/LEGO1/mxdsanim.cpp @@ -0,0 +1,13 @@ +#include "mxdsanim.h" + +// OFFSET: LEGO1 0x100c8ff0 +MxDSAnim::MxDSAnim() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c91a0 +MxDSAnim::~MxDSAnim() +{ + // TODO +} diff --git a/LEGO1/mxdsanim.h b/LEGO1/mxdsanim.h new file mode 100644 index 00000000..fdef0859 --- /dev/null +++ b/LEGO1/mxdsanim.h @@ -0,0 +1,29 @@ +#ifndef MXDSANIM_H +#define MXDSANIM_H + +#include "mxdsmediaaction.h" + +// VTABLE 0x100dcd88 +// SIZE 0xb8 +class MxDSAnim : public MxDSMediaAction +{ +public: + MxDSAnim(); + + virtual ~MxDSAnim() override; + + // OFFSET: LEGO1 0x100c9060 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x101025d8 + return "MxDSAnim"; + } + + // OFFSET: LEGO1 0x100c9070 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSAnim::ClassName()) || MxDSMediaAction::IsA(name); + } +}; + +#endif // MXDSANIM_H diff --git a/LEGO1/mxdschunk.cpp b/LEGO1/mxdschunk.cpp new file mode 100644 index 00000000..7ec8531c --- /dev/null +++ b/LEGO1/mxdschunk.cpp @@ -0,0 +1,13 @@ +#include "mxdschunk.h" + +// OFFSET: LEGO1 0x100be050 STUB +MxDSChunk::MxDSChunk() +{ + // TODO +} + +// OFFSET: LEGO1 0x100be170 STUB +MxDSChunk::~MxDSChunk() +{ + // TODO +} diff --git a/LEGO1/mxdschunk.h b/LEGO1/mxdschunk.h new file mode 100644 index 00000000..8758ffa3 --- /dev/null +++ b/LEGO1/mxdschunk.h @@ -0,0 +1,26 @@ +#ifndef MXDSCHUNK_H +#define MXDSCHUNK_H + +#include "mxcore.h" + +class MxDSChunk : public MxCore +{ +public: + MxDSChunk(); + virtual ~MxDSChunk() override; + + // OFFSET: LEGO1 0x100be0c0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10101e6c + return "MxDSChunk"; + } + + // OFFSET: LEGO1 0x100be0d0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSChunk::ClassName()) || MxCore::IsA(name); + } +}; + +#endif // MXDSCHUNK_H diff --git a/LEGO1/mxdsevent.cpp b/LEGO1/mxdsevent.cpp new file mode 100644 index 00000000..a45ec93a --- /dev/null +++ b/LEGO1/mxdsevent.cpp @@ -0,0 +1,13 @@ +#include "mxdsevent.h" + +// OFFSET: LEGO1 0x100c95f0 STUB +MxDSEvent::MxDSEvent() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c97a0 STUB +MxDSEvent::~MxDSEvent() +{ + // TODO +} diff --git a/LEGO1/mxdsevent.h b/LEGO1/mxdsevent.h new file mode 100644 index 00000000..59a00bb5 --- /dev/null +++ b/LEGO1/mxdsevent.h @@ -0,0 +1,26 @@ +#ifndef MXDSEVENT_H +#define MXDSEVENT_H + +#include "mxdsmediaaction.h" + +class MxDSEvent : public MxDSMediaAction +{ +public: + MxDSEvent(); + virtual ~MxDSEvent() override; + + // OFFSET: LEGO1 0x100c9660 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x101025f0 + return "MxDSEvent"; + } + + // OFFSET: LEGO1 0x100c9670 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSEvent::ClassName()) || MxDSMediaAction::IsA(name); + } +}; + +#endif // MXDSEVENT_H diff --git a/LEGO1/mxdsfile.h b/LEGO1/mxdsfile.h index ee577e78..8e136984 100644 --- a/LEGO1/mxdsfile.h +++ b/LEGO1/mxdsfile.h @@ -1,23 +1,36 @@ #ifndef MXDSFILE_H #define MXDSFILE_H -#include "mxcore.h" -#include "mxstring.h" -#include "mxioinfo.h" #include "mxdssource.h" +#include "mxioinfo.h" +#include "mxstring.h" +// VTABLE 0x100dc890 class MxDSFile : public MxDSSource { public: __declspec(dllexport) MxDSFile(const char *filename, unsigned long skipReadingChunks); - __declspec(dllexport) virtual ~MxDSFile(); - __declspec(dllexport) virtual long Open(unsigned long); - __declspec(dllexport) virtual long Close(); - __declspec(dllexport) virtual long Read(unsigned char *,unsigned long); - __declspec(dllexport) virtual long Seek(long,int); - __declspec(dllexport) virtual unsigned long GetBufferSize(); - __declspec(dllexport) virtual unsigned long GetStreamBuffersNum(); + __declspec(dllexport) virtual ~MxDSFile(); // vtable+0x0 + // OFFSET: LEGO1 0x100c0120 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10102594 + return "MxDSFile"; + } + + // OFFSET: LEGO1 0x100c0130 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSFile::ClassName()) || MxDSSource::IsA(name); + } + + __declspec(dllexport) virtual long Open(unsigned long); // vtable+0x14 + __declspec(dllexport) virtual long Close(); // vtable+0x18 + __declspec(dllexport) virtual long Read(unsigned char *,unsigned long); // vtable+0x20 + __declspec(dllexport) virtual long Seek(long,int); // vtable+0x24 + __declspec(dllexport) virtual unsigned long GetBufferSize(); // vtable+0x28 + __declspec(dllexport) virtual unsigned long GetStreamBuffersNum(); // vtable+0x2c private: long ReadChunks(); struct ChunkHeader { diff --git a/LEGO1/mxdsmediaaction.cpp b/LEGO1/mxdsmediaaction.cpp new file mode 100644 index 00000000..9587b152 --- /dev/null +++ b/LEGO1/mxdsmediaaction.cpp @@ -0,0 +1,13 @@ +#include "mxdsmediaaction.h" + +// OFFSET: LEGO1 0x100c8b40 +MxDSMediaAction::MxDSMediaAction() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c8cf0 +MxDSMediaAction::~MxDSMediaAction() +{ + // TODO +} diff --git a/LEGO1/mxdsmediaaction.h b/LEGO1/mxdsmediaaction.h new file mode 100644 index 00000000..5beb12f5 --- /dev/null +++ b/LEGO1/mxdsmediaaction.h @@ -0,0 +1,29 @@ +#ifndef MXDSMEDIAACTION_H +#define MXDSMEDIAACTION_H + +#include "mxdsaction.h" + +// VTABLE 0x100dcd40 +// SIZE 0xb8 +class MxDSMediaAction : public MxDSAction +{ +public: + MxDSMediaAction(); + virtual ~MxDSMediaAction() override; + + // OFFSET: LEGO1 0x100c8be0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f7624 + return "MxDSMediaAction"; + } + + // OFFSET: LEGO1 0x100c8bf0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSMediaAction::ClassName()) || MxDSAction::IsA(name); + } + +}; + +#endif // MXDSMEDIAACTION_H diff --git a/LEGO1/mxdsmultiaction.cpp b/LEGO1/mxdsmultiaction.cpp new file mode 100644 index 00000000..4b36f2ec --- /dev/null +++ b/LEGO1/mxdsmultiaction.cpp @@ -0,0 +1,13 @@ +#include "mxdsmultiaction.h" + +// OFFSET: LEGO1 0x100c9b90 +MxDSMultiAction::MxDSMultiAction() +{ + +} + +// OFFSET: LEGO1 0x100ca060 +MxDSMultiAction::~MxDSMultiAction() +{ + +} diff --git a/LEGO1/mxdsmultiaction.h b/LEGO1/mxdsmultiaction.h new file mode 100644 index 00000000..af3d69df --- /dev/null +++ b/LEGO1/mxdsmultiaction.h @@ -0,0 +1,28 @@ +#ifndef MXDSMULTIACTION_H +#define MXDSMULTIACTION_H + +#include "mxdsaction.h" + +// VTABLE 0x100dcef0 +// SIZE 0x9c +class MxDSMultiAction : public MxDSAction +{ +public: + MxDSMultiAction(); + virtual ~MxDSMultiAction() override; + + // OFFSET: LEGO1 0x100c9f50 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10101dbc + return "MxDSMultiAction"; + } + + // OFFSET: LEGO1 0x100c9f60 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSMultiAction::ClassName()) || MxDSAction::IsA(name); + } +}; + +#endif // MXDSMULTIACTION_H diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index 7323f446..11b912a0 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -15,6 +15,12 @@ MxDSObject::MxDSObject() this->m_unk28 = 0; } +// OFFSET: LEGO1 0x100bf7e0 +MxDSObject::~MxDSObject() +{ + // TODO +} + // OFFSET: LEGO1 0x100bf8e0 void MxDSObject::SetObjectName(const char *p_name) { diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index 468076f7..4f0aced6 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -4,12 +4,28 @@ #include "mxcore.h" #include "mxatomid.h" +// VTABLE 0x100dc868 +// SIZE 0x2c class MxDSObject : public MxCore { public: __declspec(dllexport) void SetObjectName(const char *); MxDSObject(); + virtual ~MxDSObject() override; + + // OFFSET: LEGO1 0x100bf730 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10101400 + return "MxDSObject"; + } + + // OFFSET: LEGO1 0x100bf740 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSObject::ClassName()) || MxCore::IsA(name); + } inline const MxAtomId& GetAtomId() { return this->m_atomId; } inline int GetUnknown1c() { return this->m_unk1c; } diff --git a/LEGO1/mxdsobjectaction.cpp b/LEGO1/mxdsobjectaction.cpp new file mode 100644 index 00000000..990168da --- /dev/null +++ b/LEGO1/mxdsobjectaction.cpp @@ -0,0 +1,13 @@ +#include "mxdsobjectaction.h" + +// OFFSET: LEGO1 0x100c8870 +MxDSObjectAction::MxDSObjectAction() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c8a20 +MxDSObjectAction::~MxDSObjectAction() +{ + // TODO +} diff --git a/LEGO1/mxdsobjectaction.h b/LEGO1/mxdsobjectaction.h new file mode 100644 index 00000000..12e147fc --- /dev/null +++ b/LEGO1/mxdsobjectaction.h @@ -0,0 +1,28 @@ +#ifndef MXDSOBJECTACTION_H +#define MXDSOBJECTACTION_H + +#include "mxdsmediaaction.h" + +// VTABLE 0x100dccf8 +// SIZE 0xb8 +class MxDSObjectAction : public MxDSMediaAction +{ +public: + MxDSObjectAction(); + virtual ~MxDSObjectAction() override; + + // OFFSET: LEGO1 0x100c88e0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x101025c4 + return "MxDSObjectAction"; + } + + // OFFSET: LEGO1 0x100c88f0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSObjectAction::ClassName()) || MxDSMediaAction::IsA(name); + } +}; + +#endif // MXDSOBJECTACTION_H diff --git a/LEGO1/mxdsparallelaction.cpp b/LEGO1/mxdsparallelaction.cpp new file mode 100644 index 00000000..78b9623a --- /dev/null +++ b/LEGO1/mxdsparallelaction.cpp @@ -0,0 +1,13 @@ +#include "mxdsparallelaction.h" + +// OFFSET: LEGO1 0x100cae80 +MxDSParallelAction::MxDSParallelAction() +{ + +} + +// OFFSET: LEGO1 0x100cb040 +MxDSParallelAction::~MxDSParallelAction() +{ + +} diff --git a/LEGO1/mxdsparallelaction.h b/LEGO1/mxdsparallelaction.h new file mode 100644 index 00000000..067dc82c --- /dev/null +++ b/LEGO1/mxdsparallelaction.h @@ -0,0 +1,29 @@ +#ifndef MXDSPARALLELACTION_H +#define MXDSPARALLELACTION_H + +#include "mxdsmultiaction.h" + +// VTABLE 0x100dcf80 +// SIZE 0x9c +class MxDSParallelAction : public MxDSMultiAction +{ +public: + MxDSParallelAction(); + virtual ~MxDSParallelAction() override; + + // OFFSET: LEGO1 0x100caf00 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10102608 + return "MxDSParallelAction"; + } + + // OFFSET: LEGO1 0x100caf10 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSParallelAction::ClassName()) || MxDSMultiAction::IsA(name); + } + +}; + +#endif // MXDSPARALLELACTION_H diff --git a/LEGO1/mxdsselectaction.cpp b/LEGO1/mxdsselectaction.cpp new file mode 100644 index 00000000..575aba29 --- /dev/null +++ b/LEGO1/mxdsselectaction.cpp @@ -0,0 +1,13 @@ +#include "mxdsselectaction.h" + +// OFFSET: LEGO1 0x100cb2b0 +MxDSSelectAction::MxDSSelectAction() +{ + +} + +// OFFSET: LEGO1 0x100cb8d0 +MxDSSelectAction::~MxDSSelectAction() +{ + +} diff --git a/LEGO1/mxdsselectaction.h b/LEGO1/mxdsselectaction.h new file mode 100644 index 00000000..cb5374e1 --- /dev/null +++ b/LEGO1/mxdsselectaction.h @@ -0,0 +1,29 @@ +#ifndef MXDSSELECTACTION_H +#define MXDSSELECTACTION_H + +#include "mxdsparallelaction.h" + +// VTABLE 0x100dcfc8 +// SIZE 0xb0 +class MxDSSelectAction : public MxDSParallelAction +{ +public: + MxDSSelectAction(); + virtual ~MxDSSelectAction() override; + + // OFFSET: LEGO1 0x100cb6f0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x1010261c + return "MxDSSelectAction"; + } + + // OFFSET: LEGO1 0x100cb700 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSSelectAction::ClassName()) || MxDSParallelAction::IsA(name); + } + +}; + +#endif // MXDSSELECTACTION_H diff --git a/LEGO1/mxdsserialaction.cpp b/LEGO1/mxdsserialaction.cpp new file mode 100644 index 00000000..a5e8f623 --- /dev/null +++ b/LEGO1/mxdsserialaction.cpp @@ -0,0 +1,13 @@ +#include "mxdsserialaction.h" + +// OFFSET: LEGO1 0x100ca9d0 +MxDSSerialAction::MxDSSerialAction() +{ + +} + +// OFFSET: LEGO1 0x100cac10 +MxDSSerialAction::~MxDSSerialAction() +{ + +} diff --git a/LEGO1/mxdsserialaction.h b/LEGO1/mxdsserialaction.h new file mode 100644 index 00000000..2b260556 --- /dev/null +++ b/LEGO1/mxdsserialaction.h @@ -0,0 +1,28 @@ +#ifndef MXDSSERIALACTION_H +#define MXDSSERIALACTION_H + +#include "mxdsmultiaction.h" + +// VTABLE 0x100dcf38 +// SIZE 0xa8 +class MxDSSerialAction : public MxDSMultiAction +{ +public: + MxDSSerialAction(); + virtual ~MxDSSerialAction() override; + + // OFFSET: LEGO1 0x100caad0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f75dc + return "MxDSSerialAction"; + } + + // OFFSET: LEGO1 0x100caae0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSSerialAction::ClassName()) || MxDSMultiAction::IsA(name); + } +}; + +#endif // MXDSSERIALACTION_H diff --git a/LEGO1/mxdssound.cpp b/LEGO1/mxdssound.cpp new file mode 100644 index 00000000..4f2b0d61 --- /dev/null +++ b/LEGO1/mxdssound.cpp @@ -0,0 +1,13 @@ +#include "mxdssound.h" + +// OFFSET: LEGO1 0x100c92c0 +MxDSSound::MxDSSound() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c9470 +MxDSSound::~MxDSSound() +{ + // TODO +} diff --git a/LEGO1/mxdssound.h b/LEGO1/mxdssound.h new file mode 100644 index 00000000..45a61d63 --- /dev/null +++ b/LEGO1/mxdssound.h @@ -0,0 +1,29 @@ +#ifndef MXDSSOUND_H +#define MXDSSOUND_H + +#include "mxdsmediaaction.h" + +// VTABLE 0x100dcdd0 +// SIZE 0xc0 +class MxDSSound : public MxDSMediaAction +{ +public: + MxDSSound(); + virtual ~MxDSSound() override; + + // OFFSET: LEGO1 0x100c9330 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x101025e4 + return "MxDSSound"; + } + + // OFFSET: LEGO1 0x100c9340 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSSound::ClassName()) || MxDSMediaAction::IsA(name); + } +}; + + +#endif // MXDSSOUND_H diff --git a/LEGO1/mxdssource.h b/LEGO1/mxdssource.h index 7ee01490..2837e7c2 100644 --- a/LEGO1/mxdssource.h +++ b/LEGO1/mxdssource.h @@ -3,6 +3,7 @@ #include "mxcore.h" +// VTABLE 0x100dc8c8 class MxDSSource : public MxCore { public: @@ -12,6 +13,19 @@ class MxDSSource : public MxCore , m_position(-1) {} + // OFFSET: LEGO1 0x100c0010 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x10102588 + return "MxDSSource"; + } + + // OFFSET: LEGO1 0x100c0020 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSSource::ClassName()) || MxCore::IsA(name); + } + virtual long Open(unsigned long) = 0; virtual long Close() = 0; virtual void SomethingWhichCallsRead(void* pUnknownObject); @@ -27,4 +41,4 @@ class MxDSSource : public MxCore long m_position; }; -#endif // MXDSSOURCE_H \ No newline at end of file +#endif // MXDSSOURCE_H diff --git a/LEGO1/mxdsstill.cpp b/LEGO1/mxdsstill.cpp new file mode 100644 index 00000000..0a5434f1 --- /dev/null +++ b/LEGO1/mxdsstill.cpp @@ -0,0 +1,13 @@ +#include "mxdsstill.h" + +// OFFSET: LEGO1 0x100c98c0 +MxDSStill::MxDSStill() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c9a70 +MxDSStill::~MxDSStill() +{ + // TODO +} diff --git a/LEGO1/mxdsstill.h b/LEGO1/mxdsstill.h new file mode 100644 index 00000000..920f890a --- /dev/null +++ b/LEGO1/mxdsstill.h @@ -0,0 +1,28 @@ +#ifndef MXDSSTILL_H +#define MXDSSTILL_H + +#include "mxdsmediaaction.h" + +// VTABLE 0x100dce60 +// SIZE 0xb8 +class MxDSStill : public MxDSMediaAction +{ +public: + MxDSStill(); + virtual ~MxDSStill() override; + + // OFFSET: LEGO1 0x100c9930 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x101025fc + return "MxDSStill"; + } + + // OFFSET: LEGO1 0x100c9940 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSStill::ClassName()) || MxDSMediaAction::IsA(name); + } +}; + +#endif // MXDSSTILL_H diff --git a/LEGO1/mxdssubscriber.cpp b/LEGO1/mxdssubscriber.cpp new file mode 100644 index 00000000..8a011fed --- /dev/null +++ b/LEGO1/mxdssubscriber.cpp @@ -0,0 +1,13 @@ +#include "mxdssubscriber.h" + +// OFFSET: LEGO1 0x100b7bb0 +MxDSSubscriber::MxDSSubscriber() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b7e00 +MxDSSubscriber::~MxDSSubscriber() +{ + // TODO +} diff --git a/LEGO1/mxdssubscriber.h b/LEGO1/mxdssubscriber.h new file mode 100644 index 00000000..fb3b0d04 --- /dev/null +++ b/LEGO1/mxdssubscriber.h @@ -0,0 +1,28 @@ +#ifndef MXDSSUBSCRIBER_H +#define MXDSSUBSCRIBER_H + +#include "mxcore.h" + +// VTABLE 0x100dc698 +// SIZE 0x4c +class MxDSSubscriber : public MxCore +{ +public: + MxDSSubscriber(); + virtual ~MxDSSubscriber() override; + + // OFFSET: LEGO1 0x100b7d50 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x101020f8 + return "MxDSSubscriber"; + } + + // OFFSET: LEGO1 0x100b7d60 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxDSSubscriber::ClassName()) || MxCore::IsA(name); + } +}; + +#endif // MXDSSUBSCRIBER_H diff --git a/LEGO1/mxentity.cpp b/LEGO1/mxentity.cpp new file mode 100644 index 00000000..526a03e2 --- /dev/null +++ b/LEGO1/mxentity.cpp @@ -0,0 +1,13 @@ +#include "mxentity.h" + +// OFFSET: LEGO1 0x1001d190 STUB +MxEntity::MxEntity() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c110 STUB +MxEntity::~MxEntity() +{ + // TODO +} diff --git a/LEGO1/mxentity.h b/LEGO1/mxentity.h new file mode 100644 index 00000000..dda04646 --- /dev/null +++ b/LEGO1/mxentity.h @@ -0,0 +1,30 @@ +#ifndef MXENTITY_H +#define MXENTITY_H + +#include "mxcore.h" + +// VTABLE 0x100d5390 +class MxEntity : public MxCore +{ +public: + MxEntity(); + virtual ~MxEntity() override; + + // OFFSET: LEGO1 0x1000c180 + inline virtual const char* ClassName() const override // vtable+0xc + { + // 0x100f0070 + return "MxEntity"; + } + + // OFFSET: LEGO1 0x1000c190 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxEntity::ClassName()) || MxCore::IsA(name); + } + + // 0x8: MxResult + // 0xc MxAtomId +}; + +#endif // MXENTITY_H diff --git a/LEGO1/mxeventmanager.cpp b/LEGO1/mxeventmanager.cpp new file mode 100644 index 00000000..786420bc --- /dev/null +++ b/LEGO1/mxeventmanager.cpp @@ -0,0 +1,13 @@ +#include "mxeventmanager.h" + +// OFFSET: LEGO1 0x100c0360 STUB +MxEventManager::MxEventManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c03f0 STUB +MxEventManager::~MxEventManager() +{ + // TODO +} diff --git a/LEGO1/mxeventmanager.h b/LEGO1/mxeventmanager.h index 5d187256..be5a796c 100644 --- a/LEGO1/mxeventmanager.h +++ b/LEGO1/mxeventmanager.h @@ -1,9 +1,16 @@ #ifndef MXEVENTMANAGER_H #define MXEVENTMANAGER_H -class MxEventManager +#include "mxunknown100dc6b0.h" + +// VTABLE 0x100dc900 +// SIZE 0x2c +class MxEventManager : public MxUnknown100dc6b0 { - +public: + MxEventManager(); + virtual ~MxEventManager() override; + }; #endif // MXEVENTMANAGER_H diff --git a/LEGO1/mxeventpresenter.cpp b/LEGO1/mxeventpresenter.cpp new file mode 100644 index 00000000..ba78203f --- /dev/null +++ b/LEGO1/mxeventpresenter.cpp @@ -0,0 +1,19 @@ +#include "mxeventpresenter.h" + +// OFFSET: LEGO1 0x100c2b70 +MxEventPresenter::MxEventPresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x100c2d40 STUB +MxEventPresenter::~MxEventPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c2da0 STUB +void MxEventPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/mxeventpresenter.h b/LEGO1/mxeventpresenter.h new file mode 100644 index 00000000..2adb8cfa --- /dev/null +++ b/LEGO1/mxeventpresenter.h @@ -0,0 +1,32 @@ +#ifndef MXEVENTPRESENTER_H +#define MXEVENTPRESENTER_H + +#include "mxmediapresenter.h" + +// VTABLE 0x100dca88 +// SIZE 0x54 +class MxEventPresenter : public MxMediaPresenter +{ +public: + MxEventPresenter(); + virtual ~MxEventPresenter() override; + + // OFFSET: LEGO1 0x100c2c30 + inline virtual const char* ClassName() const override // vtable+0xc + { + // 0x10101dcc + return "MxEventPresenter"; + } + + // OFFSET: LEGO1 0x100c2c40 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxEventPresenter::ClassName()) || MxMediaPresenter::IsA(name); + } + +private: + void Init(); + +}; + +#endif // MXEVENTPRESENTER_H diff --git a/LEGO1/mxflcpresenter.cpp b/LEGO1/mxflcpresenter.cpp new file mode 100644 index 00000000..1e6ee289 --- /dev/null +++ b/LEGO1/mxflcpresenter.cpp @@ -0,0 +1,13 @@ +#include "mxflcpresenter.h" + +// OFFSET: LEGO1 0x100b3310 STUB +MxFlcPresenter::MxFlcPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b3420 STUB +MxFlcPresenter::~MxFlcPresenter() +{ + // TODO +} diff --git a/LEGO1/mxflcpresenter.h b/LEGO1/mxflcpresenter.h new file mode 100644 index 00000000..5d63c41c --- /dev/null +++ b/LEGO1/mxflcpresenter.h @@ -0,0 +1,28 @@ +#ifndef MXFLCPRESENTER_H +#define MXFLCPRESENTER_H + +#include "mxvideopresenter.h" + +// VTABLE 0x100dc2c0 +// SIZE 0x68 +class MxFlcPresenter : public MxVideoPresenter +{ +public: + MxFlcPresenter(); + virtual ~MxFlcPresenter() override; + + // OFFSET: LEGO1 0x100b33f0 + inline virtual const char* ClassName() const override // vtable+0xc + { + // 0x100f43c8 + return "MxFlcPresenter"; + } + + // OFFSET: LEGO1 0x1004e200 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxFlcPresenter::ClassName()) || MxVideoPresenter::IsA(name); + } +}; + +#endif // MXFLCPRESENTER_H diff --git a/LEGO1/mxloopingflcpresenter.cpp b/LEGO1/mxloopingflcpresenter.cpp new file mode 100644 index 00000000..f4602f3c --- /dev/null +++ b/LEGO1/mxloopingflcpresenter.cpp @@ -0,0 +1,19 @@ +#include "mxloopingflcpresenter.h" + +// OFFSET: LEGO1 0x100b4310 STUB +MxLoopingFlcPresenter::MxLoopingFlcPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b43b0 STUB +MxLoopingFlcPresenter::~MxLoopingFlcPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b4410 STUB +void MxLoopingFlcPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/mxloopingflcpresenter.h b/LEGO1/mxloopingflcpresenter.h new file mode 100644 index 00000000..5152e4d9 --- /dev/null +++ b/LEGO1/mxloopingflcpresenter.h @@ -0,0 +1,25 @@ +#ifndef MXLOOPINGFLCPRESENTER_H +#define MXLOOPINGFLCPRESENTER_H + +#include "mxflcpresenter.h" + +// VTABLE 0x100dc480 +// SIZE 0x6c +class MxLoopingFlcPresenter : public MxFlcPresenter +{ +public: + MxLoopingFlcPresenter(); + virtual ~MxLoopingFlcPresenter() override; + + // OFFSET: LEGO1 0x100b4380 + inline virtual const char* ClassName() const override // vtable+0xc + { + // 0x10101e20 + return "MxLoopingFlcPresenter"; + } + +private: + void Init(); +}; + +#endif // MXLOOPINGFLCPRESENTER_H diff --git a/LEGO1/mxloopingmidipresenter.h b/LEGO1/mxloopingmidipresenter.h new file mode 100644 index 00000000..e41be651 --- /dev/null +++ b/LEGO1/mxloopingmidipresenter.h @@ -0,0 +1,25 @@ +#ifndef MXLOOPINGMIDIPRESENTER_H +#define MXLOOPINGMIDIPRESENTER_H + +#include "mxmidipresenter.h" + +// VTABLE 0x100dc240 +// SIZE 0x58 +class MxLoopingMIDIPresenter : public MxMIDIPresenter +{ +public: + // OFFSET: LEGO1 0x100b1830 + inline virtual const char* ClassName() const override // vtable+0xc + { + // 0x10101de0 + return "MxLoopingMIDIPresenter"; + } + + // OFFSET: LEGO1 0x100b1840 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxLoopingMIDIPresenter::ClassName()) || MxMIDIPresenter::IsA(name); + } +}; + +#endif // MXLOOPINGMIDIPRESENTER_H diff --git a/LEGO1/mxloopingsmkpresenter.cpp b/LEGO1/mxloopingsmkpresenter.cpp new file mode 100644 index 00000000..cb038462 --- /dev/null +++ b/LEGO1/mxloopingsmkpresenter.cpp @@ -0,0 +1,19 @@ +#include "mxloopingsmkpresenter.h" + +// OFFSET: LEGO1 0x100b48b0 +MxLoopingSmkPresenter::MxLoopingSmkPresenter() +{ + Init(); +} + +// OFFSET: LEGO1 0x100b4950 STUB +MxLoopingSmkPresenter::~MxLoopingSmkPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b49b0 STUB +void MxLoopingSmkPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/mxloopingsmkpresenter.h b/LEGO1/mxloopingsmkpresenter.h new file mode 100644 index 00000000..129d98b9 --- /dev/null +++ b/LEGO1/mxloopingsmkpresenter.h @@ -0,0 +1,25 @@ +#ifndef MXLOOPINGSMKPRESENTER_H +#define MXLOOPINGSMKPRESENTER_H + +#include "mxsmkpresenter.h" + +// VTABLE 0x100dc540 +// SIZE 0x724 +class MxLoopingSmkPresenter : public MxSmkPresenter +{ +public: + MxLoopingSmkPresenter(); + virtual ~MxLoopingSmkPresenter() override; // vtable+0x0 + + // OFFSET: LEGO1 0x100b4920 + inline virtual const char* ClassName() const override // vtable+0xc + { + // 0x10101e08 + return "MxLoopingSmkPresenter"; + } + +private: + void Init(); +}; + +#endif // MXLOOPINGSMKPRESENTER_H diff --git a/LEGO1/mxmediapresenter.cpp b/LEGO1/mxmediapresenter.cpp new file mode 100644 index 00000000..793b3ea8 --- /dev/null +++ b/LEGO1/mxmediapresenter.cpp @@ -0,0 +1,14 @@ +#include "mxmediapresenter.h" + +// OFFSET: LEGO1 0x100b5d10 STUB +long MxMediaPresenter::Tickle() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x100b54e0 STUB +void MxMediaPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h new file mode 100644 index 00000000..3fb70d31 --- /dev/null +++ b/LEGO1/mxmediapresenter.h @@ -0,0 +1,35 @@ +#ifndef MXMEDIAPRESENTER_H +#define MXMEDIAPRESENTER_H + +#include "mxpresenter.h" + +// VTABLE 0x100d4cd8 +class MxMediaPresenter : public MxPresenter +{ +public: + inline MxMediaPresenter() + { + Init(); + } + + virtual long Tickle() override; // vtable+0x8, override MxCore + + // OFFSET: LEGO1 0x1000c5c0 + inline virtual const char *MxMediaPresenter::ClassName() const override // vtable+0xc + { + // 0x100f074c + return "MxMediaPresenter"; + } + + // OFFSET: LEGO1 0x1000c5d0 + inline virtual MxBool MxMediaPresenter::IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxMediaPresenter::ClassName()) || MxPresenter::IsA(name); + } + +private: + void Init(); + +}; + +#endif // MXMEDIAPRESENTER_H diff --git a/LEGO1/mxmidipresenter.h b/LEGO1/mxmidipresenter.h new file mode 100644 index 00000000..8a46d12a --- /dev/null +++ b/LEGO1/mxmidipresenter.h @@ -0,0 +1,11 @@ +#ifndef MXMIDIPRESENTER_H +#define MXMIDIPRESENTER_H + +#include "mxmusicpresenter.h" + +// VTABLE 0x100dca20 +class MxMIDIPresenter : public MxMusicPresenter +{ +}; + +#endif // MXMIDIPRESENTER_H diff --git a/LEGO1/mxmusicmanager.h b/LEGO1/mxmusicmanager.h index 23134708..4288ed1e 100644 --- a/LEGO1/mxmusicmanager.h +++ b/LEGO1/mxmusicmanager.h @@ -1,9 +1,11 @@ #ifndef MXMUSICMANAGER_H #define MXMUSICMANAGER_H -class MxMusicManager +#include "mxcore.h" + +// VTABLE 0x100dc930 +class MxMusicManager : public MxCore { - }; #endif // MXMUSICMANAGER_H diff --git a/LEGO1/mxmusicpresenter.cpp b/LEGO1/mxmusicpresenter.cpp new file mode 100644 index 00000000..562f047c --- /dev/null +++ b/LEGO1/mxmusicpresenter.cpp @@ -0,0 +1,7 @@ +#include "mxmusicpresenter.h" + +// OFFSET: LEGO1 0x100c22c0 STUB +MxMusicPresenter::MxMusicPresenter() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/mxmusicpresenter.h b/LEGO1/mxmusicpresenter.h new file mode 100644 index 00000000..e244b036 --- /dev/null +++ b/LEGO1/mxmusicpresenter.h @@ -0,0 +1,13 @@ +#ifndef MXMUSICPRESENTER_H +#define MXMUSICPRESENTER_H + +#include "mxaudiopresenter.h" + +// VTABLE 0x100dc9b8 +class MxMusicPresenter : public MxAudioPresenter +{ +public: + MxMusicPresenter(); +}; + +#endif // MXMUSICPRESENTER_H diff --git a/LEGO1/mxnextactiondatastart.h b/LEGO1/mxnextactiondatastart.h new file mode 100644 index 00000000..df2a2748 --- /dev/null +++ b/LEGO1/mxnextactiondatastart.h @@ -0,0 +1,12 @@ +#ifndef MXNEXTACTIONDATASTART_H +#define MXNEXTACTIONDATASTART_H + +#include "mxcore.h" + +// VTABLE 0x100dc9a0 +class MxNextActionDataStart : public MxCore +{ + +}; + +#endif // MXNEXTACTIONDATASTART_H diff --git a/LEGO1/mxnotificationmanager.cpp b/LEGO1/mxnotificationmanager.cpp new file mode 100644 index 00000000..8ce1f98b --- /dev/null +++ b/LEGO1/mxnotificationmanager.cpp @@ -0,0 +1,15 @@ +#include "mxnotificationmanager.h" + +// OFFSET: LEGO1 0x100ac450 STUB +MxNotificationManager::~MxNotificationManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x100ac800 STUB +long MxNotificationManager::Tickle() +{ + // TODO + + return 0; +} \ No newline at end of file diff --git a/LEGO1/mxnotificationmanager.h b/LEGO1/mxnotificationmanager.h index afa378e1..e350ba56 100644 --- a/LEGO1/mxnotificationmanager.h +++ b/LEGO1/mxnotificationmanager.h @@ -1,9 +1,17 @@ #ifndef MXNOTIFICATIONMANAGER_H #define MXNOTIFICATIONMANAGER_H -class MxNotificationManager +#include "mxcore.h" + +// VTABLE 0x100dc078 +class MxNotificationManager : public MxCore { - +public: + virtual ~MxNotificationManager(); // vtable+0x0 + + virtual long Tickle(); // vtable+0x8 + + // 0x10: MxCriticalSection }; #endif // MXNOTIFICATIONMANAGER_H diff --git a/LEGO1/mxobjectfactory.h b/LEGO1/mxobjectfactory.h index ad341edd..57809be9 100644 --- a/LEGO1/mxobjectfactory.h +++ b/LEGO1/mxobjectfactory.h @@ -1,7 +1,10 @@ #ifndef MXOBJECTFACTORY_H #define MXOBJECTFACTORY_H -class MxObjectFactory +#include "mxcore.h" + +// VTABLE 0x100dc220 +class MxObjectFactory : public MxCore { }; diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 4c7d29e8..e9f61b7a 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -8,7 +8,6 @@ #include "mxobjectfactory.h" #include "mxomnicreateflags.h" #include "mxomnicreateparam.h" -#include "mxresult.h" #include "mxsoundmanager.h" #include "mxstreamer.h" #include "mxticklemanager.h" @@ -16,6 +15,8 @@ #include "mxvariabletable.h" #include "mxvideomanager.h" +// VTABLE 0x100dc168 +// SIZE 0x68 class MxOmni : public MxCore { public: diff --git a/LEGO1/mxpalette.h b/LEGO1/mxpalette.h index ab52b412..b78efd7d 100644 --- a/LEGO1/mxpalette.h +++ b/LEGO1/mxpalette.h @@ -4,8 +4,10 @@ #include #include "mxcore.h" -#include "mxresult.h" +#include "mxtypes.h" +// VTABLE 0x100dc848 +// SIZE 0x414 class MxPalette : public MxCore { public: diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp new file mode 100644 index 00000000..893de60d --- /dev/null +++ b/LEGO1/mxpresenter.cpp @@ -0,0 +1,134 @@ +#include "mxpresenter.h" + +// OFFSET: LEGO1 0x1000bee0 STUB +void MxPresenter::DoneTickle() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b4d50 +void MxPresenter::Init() +{ + m_unk0x8 = 0; + m_action = NULL; + m_unk0x18 = 0; + m_unk0x3c = 0; + m_unk0xc = 0; + m_unk0x10 = 0; + m_unk0x14 = 0; +} + +// OFFSET: LEGO1 0x100b4fc0 STUB +void MxPresenter::ParseExtra() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c070 STUB +MxPresenter::~MxPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b5200 STUB +long MxPresenter::Tickle() +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x100b4d80 STUB +long MxPresenter::StartAction(MxStreamController *, MxDSAction *) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x100d4d74 STUB +void MxPresenter::EndAction() +{ + // TODO +} + +// OFFSET: LEGO1 0x100d4d8c STUB +void MxPresenter::Enable(unsigned char) +{ + // TODO +} + +// OFFSET: LEGO1 0x1000be30 STUB +void MxPresenter::VTable0x14() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000be40 STUB +void MxPresenter::VTable0x18() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000be60 STUB +void MxPresenter::VTable0x1c() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000be80 STUB +void MxPresenter::VTable0x20() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000bea0 STUB +void MxPresenter::VTable0x24() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000bec0 STUB +void MxPresenter::VTable0x28() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000bf70 +undefined4 MxPresenter::VTable0x34() +{ + return 0; +} + +// OFFSET: LEGO1 0x1000bf80 +void MxPresenter::InitVirtual() +{ + Init(); +} +// OFFSET: LEGO1 0x1000bf90 STUB +void MxPresenter::VTable0x44(undefined4 param) +{ + // TODO +} + +// OFFSET: LEGO1 0x1000bfb0 STUB +undefined4 MxPresenter::VTable0x48(undefined4 param) +{ + // TODO + + return undefined4(); +} + +// OFFSET: LEGO1 0x1000bfc0 +undefined4 MxPresenter::VTable0x4c() +{ + return 0; +} + +// OFFSET: LEGO1 0x1000bfd0 STUB +undefined MxPresenter::VTable0x50() +{ + // TODO + + return 0; +} diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index c4890c1f..6ea022da 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -1,18 +1,71 @@ #ifndef MXPRESENTER_H #define MXPRESENTER_H -class MxPresenter +#include "mxcore.h" + +#include "mxcriticalsection.h" + +class MxStreamController; +class MxDSAction; + +#ifndef undefined4 +#define undefined4 int +#endif + +#ifndef undefined +#define undefined int +#endif + +class MxPresenter : public MxCore { -protected: - __declspec(dllexport) virtual void DoneTickle(); - __declspec(dllexport) void Init(); - __declspec(dllexport) virtual void ParseExtra(); public: - __declspec(dllexport) virtual ~MxPresenter(); - __declspec(dllexport) virtual void Enable(unsigned char); - __declspec(dllexport) virtual void EndAction(); - __declspec(dllexport) virtual long StartAction(MxStreamController *, MxDSAction *); - __declspec(dllexport) virtual long Tickle(); + __declspec(dllexport) virtual ~MxPresenter(); // vtable+0x0 + + // OFFSET: LEGO1 0x1000bfe0 + inline virtual const char *ClassName() const // vtable+0xc + { + // 0x100f0740 + return "MxPresenter"; + } + + // OFFSET: LEGO1 0x1000bff0 + inline virtual MxBool IsA(const char *name) const // vtable+0x10 + { + return !strcmp(name, MxPresenter::ClassName()) || MxCore::IsA(name); + } + + __declspec(dllexport) virtual long Tickle(); // vtable+0x8 + virtual void VTable0x14(); // vtable+0x14 + virtual void VTable0x18(); // vtable+0x18 + virtual void VTable0x1c(); // vtable+0x1c + virtual void VTable0x20(); // vtable+0x20 + virtual void VTable0x24(); // vtable+0x24 + virtual void VTable0x28(); // vtable+0x28 + virtual undefined4 VTable0x34(); // vtable+0x34 + virtual void InitVirtual(); // vtable+0x38 + virtual void VTable0x44(undefined4 param); // vtable+0x44 + virtual undefined4 VTable0x48(undefined4 param); // vtable+0x48 + virtual undefined4 VTable0x4c(); // vtable+0x4c + virtual undefined VTable0x50(); // vtable+0x50 +protected: + __declspec(dllexport) virtual void DoneTickle(); // vtable+0x2c + __declspec(dllexport) void Init(); + __declspec(dllexport) virtual void ParseExtra(); // vtable+0x30 +public: + __declspec(dllexport) virtual long StartAction(MxStreamController *, MxDSAction *); // vtable+0x3c + __declspec(dllexport) virtual void EndAction(); // vtable+0x40 + __declspec(dllexport) virtual void Enable(unsigned char); // vtable+0x54 + + int m_unk0x8; + int m_unk0xc; + int m_unk0x10; + int m_unk0x14; + int m_unk0x18; + MxDSAction* m_action; // 0 + MxCriticalSection m_criticalSection; + int m_unk0x3c; + + // VTABLE 0x100d4d38 }; #endif // MXPRESENTER_H diff --git a/LEGO1/mxramstreamcontroller.h b/LEGO1/mxramstreamcontroller.h new file mode 100644 index 00000000..09915cbf --- /dev/null +++ b/LEGO1/mxramstreamcontroller.h @@ -0,0 +1,12 @@ +#ifndef MXRAMSTREAMCONTROLLER_H +#define MXRAMSTREAMCONTROLLER_H + +#include "mxstreamcontroller.h" + +// VTABLE 0x100dc728 +class MxRAMStreamController : public MxStreamController +{ + +}; + +#endif // MXRAMSTREAMCONTROLLER_H diff --git a/LEGO1/mxramstreamprovider.h b/LEGO1/mxramstreamprovider.h new file mode 100644 index 00000000..5422d3b3 --- /dev/null +++ b/LEGO1/mxramstreamprovider.h @@ -0,0 +1,12 @@ +#ifndef MXRAMSTREAMPROVIDER_H +#define MXRAMSTREAMPROVIDER_H + +#include "mxstreamprovider.h" + +// VTABLE 0x100dd0d0 +class MxRAMStreamProvider : public MxStreamProvider +{ + +}; + +#endif // MXRAMSTREAMPROVIDER_H diff --git a/LEGO1/mxresult.h b/LEGO1/mxresult.h deleted file mode 100644 index 7a56f493..00000000 --- a/LEGO1/mxresult.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef MXRESULT_H -#define MXRESULT_H - -typedef unsigned long MxResult; -const MxResult SUCCESS = 0; -const MxResult FAILURE = 0xFFFFFFFFL; - -#endif // MXRESULT_H diff --git a/LEGO1/mxsmkpresenter.cpp b/LEGO1/mxsmkpresenter.cpp new file mode 100644 index 00000000..9f160a99 --- /dev/null +++ b/LEGO1/mxsmkpresenter.cpp @@ -0,0 +1,13 @@ +#include "mxsmkpresenter.h" + +// OFFSET: LEGO1 0x100b3650 STUB +MxSmkPresenter::MxSmkPresenter() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b38d0 STUB +void MxSmkPresenter::Init() +{ + // TODO +} diff --git a/LEGO1/mxsmkpresenter.h b/LEGO1/mxsmkpresenter.h new file mode 100644 index 00000000..b439bc2a --- /dev/null +++ b/LEGO1/mxsmkpresenter.h @@ -0,0 +1,18 @@ +#ifndef MXSMKPRESENTER_H +#define MXSMKPRESENTER_H + +#include "mxvideopresenter.h" + +// VTABLE 0x100dc348 +// SIZE 0x720 +class MxSmkPresenter : public MxVideoPresenter +{ +public: + MxSmkPresenter(); + +private: + void Init(); + +}; + +#endif // MXSMKPRESENTER_H diff --git a/LEGO1/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp new file mode 100644 index 00000000..d12ecee1 --- /dev/null +++ b/LEGO1/mxsoundmanager.cpp @@ -0,0 +1,13 @@ +#include "mxsoundmanager.h" + +// OFFSET: LEGO1 0x100ae740 STUB +MxSoundManager::MxSoundManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x100ae7d0 STUB +MxSoundManager::~MxSoundManager() +{ + // TODO +} diff --git a/LEGO1/mxsoundmanager.h b/LEGO1/mxsoundmanager.h index 7c0b0cf1..3421a5d6 100644 --- a/LEGO1/mxsoundmanager.h +++ b/LEGO1/mxsoundmanager.h @@ -1,9 +1,17 @@ #ifndef MXSOUNDMANAGER_H #define MXSOUNDMANAGER_H +#include "mxcore.h" + +// VTABLE 0x100dc128 +// SIZE 0x3c +// Base vtables are: MxCore -> 0x100dc6b0 -> 0x100dc6e0 -> MxSoundManager class MxSoundManager { - +public: + MxSoundManager(); + virtual ~MxSoundManager() override; // vtable+0x0 + }; #endif // MXSOUNDMANAGER_H diff --git a/LEGO1/mxsoundpresenter.cpp b/LEGO1/mxsoundpresenter.cpp new file mode 100644 index 00000000..50e04ce4 --- /dev/null +++ b/LEGO1/mxsoundpresenter.cpp @@ -0,0 +1 @@ +#include "mxsoundpresenter.h" diff --git a/LEGO1/mxsoundpresenter.h b/LEGO1/mxsoundpresenter.h new file mode 100644 index 00000000..53d7000d --- /dev/null +++ b/LEGO1/mxsoundpresenter.h @@ -0,0 +1,25 @@ +#ifndef MXSOUNDPRESENTER_H +#define MXSOUNDPRESENTER_H + +#include "mxaudiopresenter.h" + +// VTABLE 0x100d4b08 +class MxSoundPresenter : public MxAudioPresenter +{ +public: + // OFFSET: LEGO1 0x1000d4a0 + inline virtual const char *ClassName() const // vtable+0x0c + { + // 0x100f07a0 + return "MxSoundPresenter"; + }; + + // OFFSET: LEGO1 0x1000d4b0 + inline virtual MxBool IsA(const char *name) const // vtable+0x10 + { + return !strcmp(name, MxSoundPresenter::ClassName()) || MxAudioPresenter::IsA(name); + }; + +}; + +#endif // MXSOUNDPRESENTER_H diff --git a/LEGO1/mxstillpresenter.cpp b/LEGO1/mxstillpresenter.cpp new file mode 100644 index 00000000..bc2b03b5 --- /dev/null +++ b/LEGO1/mxstillpresenter.cpp @@ -0,0 +1 @@ +#include "mxstillpresenter.h" diff --git a/LEGO1/mxstillpresenter.h b/LEGO1/mxstillpresenter.h new file mode 100644 index 00000000..d9376b8e --- /dev/null +++ b/LEGO1/mxstillpresenter.h @@ -0,0 +1,13 @@ +#ifndef MXSTILLPRESENTER_H +#define MXSTILLPRESENTER_H + +#include "mxvideopresenter.h" + +// VTABLE 0x100d7a38 +// SIZE 0x6c +class MxStillPresenter : public MxVideoPresenter +{ +public: +}; + +#endif // MXSTILLPRESENTER_H diff --git a/LEGO1/mxstreamchunk.h b/LEGO1/mxstreamchunk.h new file mode 100644 index 00000000..51f1a34d --- /dev/null +++ b/LEGO1/mxstreamchunk.h @@ -0,0 +1,12 @@ +#ifndef MXSTREAMCHUNK_H +#define MXSTREAMCHUNK_H + +#include "mxdschunk.h" + +// VTABLE 0x100dc2a8 +class MxStreamChunk : public MxDSChunk +{ + +}; + +#endif // MXSTREAMCHUNK_H diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h index dba24176..8884b49f 100644 --- a/LEGO1/mxstreamcontroller.h +++ b/LEGO1/mxstreamcontroller.h @@ -2,10 +2,26 @@ #define MXSTREAMCONTROLLER_H #include "mxatomid.h" +#include "mxcore.h" -class MxStreamController +// VTABLE 0x100dc968 +class MxStreamController : public MxCore { public: + + // OFFSET: LEGO1 0x100c0f10 + inline virtual const char *ClassName() const override // vtable+0xc + { + // 0x10102130 + return "MxStreamController"; + } + + // OFFSET: LEGO1 0x100c0f20 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxStreamController::ClassName()) || MxCore::IsA(name); + } + int m_unk00; int m_unk04; int m_unk08; diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp new file mode 100644 index 00000000..b6da4b1d --- /dev/null +++ b/LEGO1/mxstreamer.cpp @@ -0,0 +1,23 @@ +#include "mxstreamer.h" + +// OFFSET: LEGO1 0x100b91d0 STUB +MxStreamer::~MxStreamer() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b9b60 STUB +long MxStreamer::Notify(MxParam &p) +{ + // TODO + + return 0; +} + +// OFFSET: LEGO1 0x100b9190 STUB +MxResult MxStreamer::VTable0x14() +{ + // TODO + + return MxResult(); +} diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index 785c475b..f8eeb43b 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -1,14 +1,21 @@ #ifndef MXSTREAMER_H #define MXSTREAMER_H +#include "mxcore.h" #include "mxstreamcontroller.h" +#include "mxtypes.h" -class MxStreamer +// VTABLE 0x100dc710 +class MxStreamer : public MxCore { public: + virtual ~MxStreamer() override; + __declspec(dllexport) MxStreamController *Open(const char *name, unsigned short p); __declspec(dllexport) long Close(const char *p); + virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxResult VTable0x14() override; // vtable+0x14 }; #endif // MXSTREAMER_H diff --git a/LEGO1/mxstreamprovider.h b/LEGO1/mxstreamprovider.h new file mode 100644 index 00000000..fda71bb1 --- /dev/null +++ b/LEGO1/mxstreamprovider.h @@ -0,0 +1,12 @@ +#ifndef MXSTREAMPROVIDER_H +#define MXSTREAMPROVIDER_H + +#include "mxcore.h" + +// VTABLE 0x100dd100 +class MxStreamProvider : public MxCore +{ + +}; + +#endif // MXSTREAMPROVIDER_H diff --git a/LEGO1/mxstring.h b/LEGO1/mxstring.h index 03da0ec4..a6552bb5 100644 --- a/LEGO1/mxstring.h +++ b/LEGO1/mxstring.h @@ -3,6 +3,7 @@ #include "mxcore.h" +// VTABLE 0x100dc110 class MxString : public MxCore { public: diff --git a/LEGO1/mxticklemanager.h b/LEGO1/mxticklemanager.h index 24600dca..7ef50622 100644 --- a/LEGO1/mxticklemanager.h +++ b/LEGO1/mxticklemanager.h @@ -3,6 +3,7 @@ #include "mxcore.h" +// VTABLE 0x100d86d8 class MxTickleManager : public MxCore { public: diff --git a/LEGO1/mxtimer.h b/LEGO1/mxtimer.h index 8f35d205..d79023d8 100644 --- a/LEGO1/mxtimer.h +++ b/LEGO1/mxtimer.h @@ -3,6 +3,8 @@ #include "mxcore.h" +// VTABLE 0x100dc0e0 +// SIZE 0x10 class MxTimer : public MxCore { public: diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp new file mode 100644 index 00000000..275335e5 --- /dev/null +++ b/LEGO1/mxtransitionmanager.cpp @@ -0,0 +1,21 @@ +#include "mxtransitionmanager.h" + +// OFFSET: LEGO1 0x1004b8d0 STUB +MxTransitionManager::MxTransitionManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1004ba00 STUB +MxTransitionManager::~MxTransitionManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x1004bac0 STUB +long MxTransitionManager::Tickle() +{ + // TODO + + return 0; +} diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index 904070b9..3fdb1ebf 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -1,12 +1,19 @@ #ifndef MXTRANSITIONMANAGER_H #define MXTRANSITIONMANAGER_H +#include "mxcore.h" + class MxVideoPresenter; -class MxTransitionManager +// 0x100d7ea0 +class MxTransitionManager : public MxCore { public: + virtual ~MxTransitionManager(); // vtable+0x0 + __declspec(dllexport) void SetWaitIndicator(MxVideoPresenter *videoPresenter); + + virtual long Tickle(); // vtable+0x8 }; #endif // MXTRANSITIONMANAGER_H diff --git a/LEGO1/mxtypes.h b/LEGO1/mxtypes.h index f6e23970..71421d91 100644 --- a/LEGO1/mxtypes.h +++ b/LEGO1/mxtypes.h @@ -8,6 +8,10 @@ typedef short MxS16; typedef unsigned int MxU32; typedef int MxS32; +typedef unsigned long MxResult; +const MxResult SUCCESS = 0; +const MxResult FAILURE = 0xFFFFFFFFL; + typedef unsigned char MxBool; #ifndef TRUE @@ -18,4 +22,8 @@ typedef unsigned char MxBool; #define FALSE 0 #endif -#endif MXTYPE_H +#if defined(_MSC_VER) && _MSC_VER <= 1200 // 1200 corresponds to VC6.0 but "override" was probably added even later +#define override +#endif + +#endif // MXTYPE_H diff --git a/LEGO1/mxunknown100dc6b0.cpp b/LEGO1/mxunknown100dc6b0.cpp index e3125cef..029be1f7 100644 --- a/LEGO1/mxunknown100dc6b0.cpp +++ b/LEGO1/mxunknown100dc6b0.cpp @@ -12,4 +12,4 @@ MxResult MxUnknown100dc6b0::Init() this->m_unk08 = 0; this->m_unk0c = 0; return SUCCESS; -} \ No newline at end of file +} diff --git a/LEGO1/mxunknown100dc6b0.h b/LEGO1/mxunknown100dc6b0.h index 87779eaf..ca2ee600 100644 --- a/LEGO1/mxunknown100dc6b0.h +++ b/LEGO1/mxunknown100dc6b0.h @@ -2,9 +2,10 @@ #define MXUNKNOWN100DC6B0_H #include "mxcore.h" -#include "mxresult.h" #include "mxcriticalsection.h" +#include "mxtypes.h" +// VTABLE 0x100dc6b0 class MxUnknown100dc6b0 : public MxCore { public: diff --git a/LEGO1/mxvariabletable.h b/LEGO1/mxvariabletable.h index a82b25c4..13c70658 100644 --- a/LEGO1/mxvariabletable.h +++ b/LEGO1/mxvariabletable.h @@ -3,6 +3,8 @@ class MxVariable; +// VTABLE 0x100dc1c8 +// SIZE 0x28 class MxVariableTable { public: diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index 7c1625d1..455f4f61 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -1,5 +1,19 @@ #include "mxvideomanager.h" +// OFFSET: LEGO1 0x100be2a0 STUB +MxVideoManager::~MxVideoManager() +{ + // TODO +} + +// OFFSET: LEGO1 0x100bea90 STUB +long MxVideoManager::Tickle() +{ + // TODO + + return 0; +} + // OFFSET: LEGO1 0x100be1f0 MxVideoManager::MxVideoManager() { diff --git a/LEGO1/mxvideomanager.h b/LEGO1/mxvideomanager.h index eba332f3..d8e0c7bd 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -4,11 +4,17 @@ #include "mxunknown100dc6b0.h" #include "mxvideoparam.h" +// VTABLE 0x100dc810 +// SIZE 0x64 class MxVideoManager : public MxUnknown100dc6b0 { public: + virtual ~MxVideoManager(); + + virtual long Tickle(); // vtable+0x8 + __declspec(dllexport) void InvalidateRect(MxRect32 &); - __declspec(dllexport) virtual long RealizePalette(MxPalette *); + __declspec(dllexport) virtual long RealizePalette(MxPalette *); // vtable+0x30 MxVideoManager(); diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp new file mode 100644 index 00000000..894b1e9c --- /dev/null +++ b/LEGO1/mxvideopresenter.cpp @@ -0,0 +1 @@ +#include "mxvideopresenter.h" diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h new file mode 100644 index 00000000..eba5040c --- /dev/null +++ b/LEGO1/mxvideopresenter.h @@ -0,0 +1,23 @@ +#ifndef MXVIDEOPRESENTER_H +#define MXVIDEOPRESENTER_H + +#include "mxmediapresenter.h" + +class MxVideoPresenter : public MxMediaPresenter +{ +public: + // OFFSET: LEGO1 0x1000c820 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0760 + return "MxVideoPresenter"; + } + + // OFFSET: LEGO1 0x1000c830 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxVideoPresenter::ClassName()) || MxMediaPresenter::IsA(name); + } +}; + +#endif // MXVIDEOPRESENTER_H diff --git a/LEGO1/mxwavepresenter.cpp b/LEGO1/mxwavepresenter.cpp new file mode 100644 index 00000000..bfd69c5f --- /dev/null +++ b/LEGO1/mxwavepresenter.cpp @@ -0,0 +1,7 @@ +#include "mxwavepresenter.h" + +// OFFSET: LEGO1 0x100b1ad0 STUB +void MxWavePresenter::Init() +{ + // TODO +} diff --git a/LEGO1/mxwavepresenter.h b/LEGO1/mxwavepresenter.h new file mode 100644 index 00000000..c00d978d --- /dev/null +++ b/LEGO1/mxwavepresenter.h @@ -0,0 +1,16 @@ +#ifndef MXWAVEPRESENTER_H +#define MXWAVEPRESENTER_H + +#include "mxsoundpresenter.h" + +// VTABLE 0x100d49a8 +// SIZE 0x6c +class MxWavePresenter : public MxSoundPresenter +{ +private: + void Init(); + +public: +}; + +#endif // MXWAVEPRESENTER_H diff --git a/LEGO1/pizza.cpp b/LEGO1/pizza.cpp new file mode 100644 index 00000000..e7e9c552 --- /dev/null +++ b/LEGO1/pizza.cpp @@ -0,0 +1,13 @@ +#include "pizza.h" + +// OFFSET: LEGO1 0x10037ef0 STUB +Pizza::Pizza() +{ + // TODO +} + +// OFFSET: LEGO1 0x10038100 STUB +Pizza::~Pizza() +{ + // TODO +} diff --git a/LEGO1/pizza.h b/LEGO1/pizza.h new file mode 100644 index 00000000..c47ef40e --- /dev/null +++ b/LEGO1/pizza.h @@ -0,0 +1,16 @@ +#ifndef PIZZA_H +#define PIZZA_H + +#include "isleactor.h" + +// VTABLE 0x100d7380 +// SIZE 0x9c +class Pizza : public IsleActor +{ +public: + Pizza(); + virtual ~Pizza() override; + +}; + +#endif // PIZZA_H diff --git a/LEGO1/pizzamissionstate.cpp b/LEGO1/pizzamissionstate.cpp new file mode 100644 index 00000000..5dc85dcc --- /dev/null +++ b/LEGO1/pizzamissionstate.cpp @@ -0,0 +1 @@ +#include "pizzamissionstate.h" diff --git a/LEGO1/pizzamissionstate.h b/LEGO1/pizzamissionstate.h new file mode 100644 index 00000000..575c4972 --- /dev/null +++ b/LEGO1/pizzamissionstate.h @@ -0,0 +1,25 @@ +#ifndef PIZZAMISSIONSTATE_H +#define PIZZAMISSIONSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d7408 +class PizzaMissionState : public LegoState +{ +public: + // OFFSET: LEGO1 0x10039290 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f00d4 + return "PizzaMissionState"; + } + + // OFFSET: LEGO1 0x100392a0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, PizzaMissionState::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // PIZZAMISSIONSTATE_H diff --git a/LEGO1/pizzeria.cpp b/LEGO1/pizzeria.cpp new file mode 100644 index 00000000..3b6e8d41 --- /dev/null +++ b/LEGO1/pizzeria.cpp @@ -0,0 +1 @@ +#include "pizzeria.h" diff --git a/LEGO1/pizzeria.h b/LEGO1/pizzeria.h new file mode 100644 index 00000000..54f1a200 --- /dev/null +++ b/LEGO1/pizzeria.h @@ -0,0 +1,13 @@ +#ifndef PIZZERIASTATE_H +#define PIZZERIASTATE_H + +#include "isleactor.h" + +// VTABLE 0x100d5520 +// SIZE 0x84 +class Pizzeria : public IsleActor +{ +public: +}; + +#endif // PIZZERIASTATE_H diff --git a/LEGO1/pizzeriastate.cpp b/LEGO1/pizzeriastate.cpp new file mode 100644 index 00000000..85f8aef0 --- /dev/null +++ b/LEGO1/pizzeriastate.cpp @@ -0,0 +1,7 @@ +#include "pizzeriastate.h" + +// OFFSET: LEGO1 0x10017af0 STUB +PizzeriaState::PizzeriaState() +{ + // TODO +} diff --git a/LEGO1/pizzeriastate.h b/LEGO1/pizzeriastate.h new file mode 100644 index 00000000..70b1f127 --- /dev/null +++ b/LEGO1/pizzeriastate.h @@ -0,0 +1,15 @@ +#ifndef PIZZERIASTATE_H +#define PIZZERIASTATE_H + +#include "legostate.h" + +// VTABLE 0x100d5ee8 +// SIZE 0xb4 +class PizzeriaState : public LegoState +{ +public: + PizzeriaState(); + +}; + +#endif // PIZZERIASTATE_H diff --git a/LEGO1/police.cpp b/LEGO1/police.cpp new file mode 100644 index 00000000..bd268411 --- /dev/null +++ b/LEGO1/police.cpp @@ -0,0 +1,21 @@ +#include "police.h" + +// OFFSET: LEGO1 0x1005e130 STUB +Police::Police() +{ + // TODO +} + +// OFFSET: LEGO1 0x1005e320 STUB +Police::~Police() +{ + // TODO +} + +// OFFSET: LEGO1 0x1005e480 STUB +long Police::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/police.h b/LEGO1/police.h new file mode 100644 index 00000000..c4bea1cf --- /dev/null +++ b/LEGO1/police.h @@ -0,0 +1,19 @@ +#ifndef POLICE_H +#define POLICE_H + +#include "legoworld.h" + +// VTABLE 0x100d8a80 +// SIZE 0x110 +// Radio at 0xf8 +class Police : public LegoWorld +{ +public: + Police(); + virtual ~Police() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + +}; + +#endif // POLICE_H diff --git a/LEGO1/policeentity.cpp b/LEGO1/policeentity.cpp new file mode 100644 index 00000000..b4492be5 --- /dev/null +++ b/LEGO1/policeentity.cpp @@ -0,0 +1 @@ +#include "policeentity.h" diff --git a/LEGO1/policeentity.h b/LEGO1/policeentity.h new file mode 100644 index 00000000..a23cced4 --- /dev/null +++ b/LEGO1/policeentity.h @@ -0,0 +1,13 @@ +#ifndef POLICEENTITY_H +#define POLICEENTITY_H + +#include "buildingentity.h" + +// VTABLE 0x100d4ab0 +// SIZE 0x68 +class PoliceEntity : public BuildingEntity +{ + +}; + +#endif // POLICEENTITY_H diff --git a/LEGO1/policestate.cpp b/LEGO1/policestate.cpp new file mode 100644 index 00000000..e0995f35 --- /dev/null +++ b/LEGO1/policestate.cpp @@ -0,0 +1,7 @@ +#include "policestate.h" + +// OFFSET: LEGO1 0x1005e7c0 STUB +PoliceState::PoliceState() +{ + // TODO +} diff --git a/LEGO1/policestate.h b/LEGO1/policestate.h new file mode 100644 index 00000000..e43b5c5a --- /dev/null +++ b/LEGO1/policestate.h @@ -0,0 +1,27 @@ +#ifndef POLICESTATE_H +#define POLICESTATE_H + +#include "legostate.h" + +// VTABLE 0x100d8af0 +// SIZE 0x10 +class PoliceState : public LegoState +{ +public: + PoliceState(); + + // OFFSET: LEGO1 0x1005e860 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0444 + return "PoliceState"; + } + + // OFFSET: LEGO1 0x1005e870 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, PoliceState::ClassName()) || LegoState::IsA(name); + } +}; + +#endif // POLICESTATE_H diff --git a/LEGO1/racecar.cpp b/LEGO1/racecar.cpp new file mode 100644 index 00000000..59bb5146 --- /dev/null +++ b/LEGO1/racecar.cpp @@ -0,0 +1,13 @@ +#include "racecar.h" + +// OFFSET: LEGO1 0x10028200 STUB +RaceCar::RaceCar() +{ + // TODO +} + +// OFFSET: LEGO1 0x10028420 STUB +RaceCar::~RaceCar() +{ + // TODO +} diff --git a/LEGO1/racecar.h b/LEGO1/racecar.h new file mode 100644 index 00000000..f8bd6ccf --- /dev/null +++ b/LEGO1/racecar.h @@ -0,0 +1,15 @@ +#ifndef RACECAR_H +#define RACECAR_H + +#include "islepathactor.h" + +// VTABLE 0x100d6918 +// SIZE 0x164 +class RaceCar : public IslePathActor +{ +public: + RaceCar(); + virtual ~RaceCar() override; // vtable+0x0 +}; + +#endif // RACECAR_H diff --git a/LEGO1/racestandsentity.cpp b/LEGO1/racestandsentity.cpp new file mode 100644 index 00000000..13e65bb4 --- /dev/null +++ b/LEGO1/racestandsentity.cpp @@ -0,0 +1 @@ +#include "racestandsentity.h" diff --git a/LEGO1/racestandsentity.h b/LEGO1/racestandsentity.h new file mode 100644 index 00000000..cbf0946c --- /dev/null +++ b/LEGO1/racestandsentity.h @@ -0,0 +1,12 @@ +#ifndef RACESTANDSENTITY_H +#define RACESTANDSENTITY_H + +#include "buildingentity.h" + +// VTABLE 0x100d48a8 +// SIZE 0x68 +class RaceStandsEntity : public BuildingEntity +{ +}; + +#endif // RACESTANDSENTITY_H diff --git a/LEGO1/racestate.cpp b/LEGO1/racestate.cpp new file mode 100644 index 00000000..4eeb21b7 --- /dev/null +++ b/LEGO1/racestate.cpp @@ -0,0 +1,7 @@ +#include "racestate.h" + +// OFFSET: LEGO1 0x10015f30 STUB +RaceState::RaceState() +{ + // TODO +} diff --git a/LEGO1/racestate.h b/LEGO1/racestate.h new file mode 100644 index 00000000..b9415051 --- /dev/null +++ b/LEGO1/racestate.h @@ -0,0 +1,28 @@ +#ifndef RACESTATE_H +#define RACESTATE_H + +#include "legostate.h" + +// VTABLE 0x100d5e30 +// SIZE probably 0x2c +class RaceState : public LegoState +{ +public: + RaceState(); + + // OFFSET: LEGO1 0x10016010 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f07d0 + return "RaceState"; + } + + // OFFSET: LEGO1 0x10016020 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, RaceState::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // RACESTATE_H diff --git a/LEGO1/radio.cpp b/LEGO1/radio.cpp new file mode 100644 index 00000000..935fb141 --- /dev/null +++ b/LEGO1/radio.cpp @@ -0,0 +1,7 @@ +#include "radio.h" + +// OFFSET: LEGO1 0x1002c990 STUB +Radio::~Radio() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/radio.h b/LEGO1/radio.h new file mode 100644 index 00000000..83b3a445 --- /dev/null +++ b/LEGO1/radio.h @@ -0,0 +1,14 @@ +#ifndef RADIO_H +#define RADIO_H + +#include "mxcore.h" + +// VTABLE 0x100d6d10 +class Radio : public MxCore +{ +public: + virtual ~Radio() override; + +}; + +#endif // RADIO_H diff --git a/LEGO1/radiostate.cpp b/LEGO1/radiostate.cpp new file mode 100644 index 00000000..e6ce8782 --- /dev/null +++ b/LEGO1/radiostate.cpp @@ -0,0 +1,7 @@ +#include "radiostate.h" + +// OFFSET: LEGO1 0x1002ce10 STUB +RadioState::RadioState() +{ + // TODO +} diff --git a/LEGO1/radiostate.h b/LEGO1/radiostate.h new file mode 100644 index 00000000..99c1c925 --- /dev/null +++ b/LEGO1/radiostate.h @@ -0,0 +1,28 @@ +#ifndef RADIOSTATE_H +#define RADIOSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d6d28 +// SIZE 0x30 +class RadioState : public LegoState +{ +public: + RadioState(); + + // OFFSET: LEGO1 0x1002cf60 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f04f8 + return "RadioState"; + } + + // OFFSET: LEGO1 0x1002cf70 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, RadioState::ClassName()) || LegoState::IsA(name); + } + +}; + +#endif // RADIOSTATE_H diff --git a/LEGO1/registrationbook.cpp b/LEGO1/registrationbook.cpp new file mode 100644 index 00000000..5668d31c --- /dev/null +++ b/LEGO1/registrationbook.cpp @@ -0,0 +1,21 @@ +#include "registrationbook.h" + +// OFFSET: LEGO1 0x10076d20 STUB +RegistrationBook::RegistrationBook() +{ + // TODO +} + +// OFFSET: LEGO1 0x10076f50 STUB +RegistrationBook::~RegistrationBook() +{ + // TODO +} + +// OFFSET: LEGO1 0x100770e0 STUB +long RegistrationBook::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/registrationbook.h b/LEGO1/registrationbook.h new file mode 100644 index 00000000..4dba2173 --- /dev/null +++ b/LEGO1/registrationbook.h @@ -0,0 +1,18 @@ +#ifndef REGISTRATIONBOOK_H +#define REGISTRATIONBOOK_H + +#include "legoworld.h" + +// VTABLE 0x100d9928 +// SIZE 0x2d0 +class RegistrationBook : public LegoWorld +{ +public: + RegistrationBook(); + virtual ~RegistrationBook() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + +}; + +#endif // REGISTRATIONBOOK_H diff --git a/LEGO1/score.cpp b/LEGO1/score.cpp new file mode 100644 index 00000000..4e3c7801 --- /dev/null +++ b/LEGO1/score.cpp @@ -0,0 +1,21 @@ +#include "score.h" + +// OFFSET: LEGO1 0x10001000 STUB +Score::Score() +{ + // TODO +} + +// OFFSET: LEGO1 0x10001200 STUB +Score::~Score() +{ + // TODO +} + +// OFFSET: LEGO1 0x10001410 STUB +long Score::Notify(MxParam &p) +{ + // TODO + + return 0; +} diff --git a/LEGO1/score.h b/LEGO1/score.h new file mode 100644 index 00000000..d2a7a7f6 --- /dev/null +++ b/LEGO1/score.h @@ -0,0 +1,18 @@ +#ifndef SCORE_H +#define SCORE_H + +#include "legoworld.h" + +// VTABLE 0x100d4018 +// SIZE 0x104 +class Score : public LegoWorld +{ +public: + Score(); + virtual ~Score() override; // vtable+0x0 + + virtual long Notify(MxParam &p) override; // vtable+0x4 + +}; + +#endif // SCORE_H diff --git a/LEGO1/scorestate.cpp b/LEGO1/scorestate.cpp new file mode 100644 index 00000000..826ab482 --- /dev/null +++ b/LEGO1/scorestate.cpp @@ -0,0 +1 @@ +#include "scorestate.h" diff --git a/LEGO1/scorestate.h b/LEGO1/scorestate.h new file mode 100644 index 00000000..4f5a8dc2 --- /dev/null +++ b/LEGO1/scorestate.h @@ -0,0 +1,26 @@ +#ifndef SCORESTATE_H +#define SCORESTATE_H + +#include "legostate.h" + +// VTABLE 0x100d53f8 +// SIZE 0xc +class ScoreState : public LegoState +{ +public: + // OFFSET: LEGO1 0x1000de40 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f0084 + return "ScoreState"; + }; + + // OFFSET: LEGO1 0x1000de50 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, ScoreState::ClassName()) || LegoState::IsA(name); + }; + +}; + +#endif // SCORESTATE_H diff --git a/LEGO1/skateboard.cpp b/LEGO1/skateboard.cpp new file mode 100644 index 00000000..42466206 --- /dev/null +++ b/LEGO1/skateboard.cpp @@ -0,0 +1,7 @@ +#include "skateboard.h" + +// OFFSET: LEGO1 0x1000fd40 STUB +SkateBoard::SkateBoard() +{ + // TODO +} diff --git a/LEGO1/skateboard.h b/LEGO1/skateboard.h new file mode 100644 index 00000000..f290dc7b --- /dev/null +++ b/LEGO1/skateboard.h @@ -0,0 +1,15 @@ +#ifndef SKATEBOARD_H +#define SKATEBOARD_H + +#include "islepathactor.h" + +// VTABLE 0x100d55f0 +// SIZE 0x168 +class SkateBoard : public IslePathActor +{ +public: + SkateBoard(); + +}; + +#endif // SKATEBOARD_H diff --git a/LEGO1/towtrack.cpp b/LEGO1/towtrack.cpp new file mode 100644 index 00000000..90d3d018 --- /dev/null +++ b/LEGO1/towtrack.cpp @@ -0,0 +1,7 @@ +#include "towtrack.h" + +// OFFSET: LEGO1 0x1004c720 STUB +TowTrack::TowTrack() +{ + // TODO +} diff --git a/LEGO1/towtrack.h b/LEGO1/towtrack.h new file mode 100644 index 00000000..95e6885a --- /dev/null +++ b/LEGO1/towtrack.h @@ -0,0 +1,16 @@ +#ifndef TOWTRACK_H +#define TOWTRACK_H + +#include "islepathactor.h" + +// VTABLE 0x100d7ee0 +// SIZE 0x180 +class TowTrack : public IslePathActor +{ +public: + TowTrack(); + +}; + + +#endif // TOWTRACK_H diff --git a/LEGO1/towtrackmissionstate.cpp b/LEGO1/towtrackmissionstate.cpp new file mode 100644 index 00000000..b85c40cc --- /dev/null +++ b/LEGO1/towtrackmissionstate.cpp @@ -0,0 +1,7 @@ +#include "towtrackmissionstate.h" + +// OFFSET: LEGO1 0x1004dd30 STUB +TowTrackMissionState::TowTrackMissionState() +{ + // TODO +} diff --git a/LEGO1/towtrackmissionstate.h b/LEGO1/towtrackmissionstate.h new file mode 100644 index 00000000..a335584f --- /dev/null +++ b/LEGO1/towtrackmissionstate.h @@ -0,0 +1,28 @@ +#ifndef TOWTRACKMISSIONSTATE_H +#define TOWTRACKMISSIONSTATE_H + +#include "legostate.h" + +// VTABLE 0x100d7fd8 +// SIZE 0x28 +class TowTrackMissionState : LegoState +{ +public: + TowTrackMissionState(); + + // OFFSET: LEGO1 0x1004dfa0 + inline virtual const char *ClassName() const // vtable+0x0c + { + // 0x100f00bc + return "TowTrackMissionState"; + }; + + // OFFSET: LEGO1 0x1004dfb0 + inline virtual MxBool IsA(const char *name) const // vtable+0x10 + { + return !strcmp(name, TowTrackMissionState::ClassName()) || LegoState::IsA(name); + }; + +}; + +#endif // TOWTRACKMISSIONSTATE_H diff --git a/isle.mak b/isle.mak index ea007e37..90a2cead 100644 --- a/isle.mak +++ b/isle.mak @@ -54,28 +54,153 @@ INTDIR=.\LEGO1\Release ALL : ".\Release\LEGO1.DLL" CLEAN : + -@erase "$(INTDIR)\act1state.obj" + -@erase "$(INTDIR)\act2brick.obj" + -@erase "$(INTDIR)\act2policestation.obj" + -@erase "$(INTDIR)\act3.obj" + -@erase "$(INTDIR)\act3shark.obj" + -@erase "$(INTDIR)\act3state.obj" + -@erase "$(INTDIR)\ambulance.obj" + -@erase "$(INTDIR)\ambulancemissionstate.obj" + -@erase "$(INTDIR)\animstate.obj" + -@erase "$(INTDIR)\beachhouseentity.obj" + -@erase "$(INTDIR)\bike.obj" + -@erase "$(INTDIR)\buildingentity.obj" + -@erase "$(INTDIR)\bumpbouy.obj" + -@erase "$(INTDIR)\carrace.obj" -@erase "$(INTDIR)\dllmain.obj" + -@erase "$(INTDIR)\dunebuggy.obj" + -@erase "$(INTDIR)\elevatorbottom.obj" + -@erase "$(INTDIR)\gasstation.obj" + -@erase "$(INTDIR)\gasstationentity.obj" + -@erase "$(INTDIR)\gasstationstate.obj" + -@erase "$(INTDIR)\helicopter.obj" + -@erase "$(INTDIR)\helicopterstate.obj" + -@erase "$(INTDIR)\historybook.obj" + -@erase "$(INTDIR)\hospital.obj" + -@erase "$(INTDIR)\hospitalentity.obj" + -@erase "$(INTDIR)\hospitalstate.obj" + -@erase "$(INTDIR)\infocenter.obj" + -@erase "$(INTDIR)\infocenterdoor.obj" + -@erase "$(INTDIR)\infocenterentity.obj" + -@erase "$(INTDIR)\infocenterstate.obj" + -@erase "$(INTDIR)\isle.obj" + -@erase "$(INTDIR)\isleactor.obj" + -@erase "$(INTDIR)\islepathactor.obj" + -@erase "$(INTDIR)\jetski.obj" + -@erase "$(INTDIR)\jetskiRace.obj" + -@erase "$(INTDIR)\jukebox.obj" + -@erase "$(INTDIR)\jukeboxentity.obj" + -@erase "$(INTDIR)\jukeboxstate.obj" + -@erase "$(INTDIR)\legoact2state.obj" + -@erase "$(INTDIR)\legoactioncontrolpresenter.obj" + -@erase "$(INTDIR)\legoanimactor.obj" + -@erase "$(INTDIR)\legoanimationmanager.obj" + -@erase "$(INTDIR)\legoanimmmpresenter.obj" + -@erase "$(INTDIR)\legoanimpresenter.obj" + -@erase "$(INTDIR)\legobuildingmanager.obj" + -@erase "$(INTDIR)\legocachesound.obj" + -@erase "$(INTDIR)\legocameracontroller.obj" + -@erase "$(INTDIR)\legocarbuild.obj" + -@erase "$(INTDIR)\legocarbuildanimpresenter.obj" + -@erase "$(INTDIR)\legocontrolmanager.obj" + -@erase "$(INTDIR)\legoentity.obj" + -@erase "$(INTDIR)\legoentitypresenter.obj" + -@erase "$(INTDIR)\legoflctexturepresenter.obj" + -@erase "$(INTDIR)\legohideanimpresenter.obj" + -@erase "$(INTDIR)\legoinputmanager.obj" + -@erase "$(INTDIR)\legojetski.obj" + -@erase "$(INTDIR)\legoloadcachesoundpresenter.obj" + -@erase "$(INTDIR)\legolocomotionanimpresenter.obj" -@erase "$(INTDIR)\legonavcontroller.obj" -@erase "$(INTDIR)\legoomni.obj" + -@erase "$(INTDIR)\legopalettepresenter.obj" + -@erase "$(INTDIR)\legopathactor.obj" + -@erase "$(INTDIR)\legopathcontroller.obj" + -@erase "$(INTDIR)\legopathpresenter.obj" + -@erase "$(INTDIR)\legophonemepresenter.obj" + -@erase "$(INTDIR)\legoplantmanager.obj" + -@erase "$(INTDIR)\legorace.obj" + -@erase "$(INTDIR)\legosoundmanager.obj" + -@erase "$(INTDIR)\legostate.obj" + -@erase "$(INTDIR)\legotexturepresenter.obj" + -@erase "$(INTDIR)\legovideomanager.obj" + -@erase "$(INTDIR)\legoworld.obj" + -@erase "$(INTDIR)\legoworldpresenter.obj" + -@erase "$(INTDIR)\motorcycle.obj" -@erase "$(INTDIR)\mxatomid.obj" + -@erase "$(INTDIR)\mxaudiopresenter.obj" -@erase "$(INTDIR)\mxautolocker.obj" + -@erase "$(INTDIR)\mxbackgroundaudiomanager.obj" + -@erase "$(INTDIR)\mxcompositemediapresenter.obj" + -@erase "$(INTDIR)\mxcompositepresenter.obj" + -@erase "$(INTDIR)\mxcontrolpresenter.obj" -@erase "$(INTDIR)\mxcore.obj" -@erase "$(INTDIR)\mxcriticalsection.obj" + -@erase "$(INTDIR)\mxdiskstreamcontroller.obj" + -@erase "$(INTDIR)\mxdiskstreamprovider.obj" + -@erase "$(INTDIR)\mxdsaction.obj" + -@erase "$(INTDIR)\mxdsanim.obj" + -@erase "$(INTDIR)\mxdschunk.obj" + -@erase "$(INTDIR)\mxdsevent.obj" -@erase "$(INTDIR)\mxdsfile.obj" + -@erase "$(INTDIR)\mxdsmediaaction.obj" + -@erase "$(INTDIR)\mxdsmultiaction.obj" -@erase "$(INTDIR)\mxdsobject.obj" + -@erase "$(INTDIR)\mxdsobjectaction.obj" + -@erase "$(INTDIR)\mxdsparallelaction.obj" + -@erase "$(INTDIR)\mxdsselectaction.obj" + -@erase "$(INTDIR)\mxdsserialaction.obj" + -@erase "$(INTDIR)\mxdssound.obj" -@erase "$(INTDIR)\mxdssource.obj" + -@erase "$(INTDIR)\mxdsstill.obj" + -@erase "$(INTDIR)\mxdssubscriber.obj" + -@erase "$(INTDIR)\mxentity.obj" + -@erase "$(INTDIR)\mxeventmanager.obj" + -@erase "$(INTDIR)\mxeventpresenter.obj" + -@erase "$(INTDIR)\mxflcpresenter.obj" -@erase "$(INTDIR)\mxioinfo.obj" + -@erase "$(INTDIR)\mxloopingflcpresenter.obj" + -@erase "$(INTDIR)\mxloopingsmkpresenter.obj" + -@erase "$(INTDIR)\mxmediapresenter.obj" + -@erase "$(INTDIR)\mxmusicpresenter.obj" + -@erase "$(INTDIR)\mxnotificationmanager.obj" -@erase "$(INTDIR)\mxomni.obj" -@erase "$(INTDIR)\mxomnicreateflags.obj" -@erase "$(INTDIR)\mxomnicreateparam.obj" -@erase "$(INTDIR)\mxomnicreateparambase.obj" -@erase "$(INTDIR)\mxpalette.obj" + -@erase "$(INTDIR)\mxpresenter.obj" + -@erase "$(INTDIR)\mxsmkpresenter.obj" + -@erase "$(INTDIR)\mxsoundmanager.obj" + -@erase "$(INTDIR)\mxsoundpresenter.obj" + -@erase "$(INTDIR)\mxstillpresenter.obj" + -@erase "$(INTDIR)\mxstreamer.obj" -@erase "$(INTDIR)\mxstring.obj" -@erase "$(INTDIR)\mxtimer.obj" + -@erase "$(INTDIR)\mxtransitionmanager.obj" -@erase "$(INTDIR)\mxunknown100dc6b0.obj" -@erase "$(INTDIR)\mxvideomanager.obj" -@erase "$(INTDIR)\mxvideoparam.obj" -@erase "$(INTDIR)\mxvideoparamflags.obj" + -@erase "$(INTDIR)\mxvideopresenter.obj" + -@erase "$(INTDIR)\mxwavepresenter.obj" + -@erase "$(INTDIR)\pizza.obj" + -@erase "$(INTDIR)\pizzeria.obj" + -@erase "$(INTDIR)\pizzeriastate.obj" + -@erase "$(INTDIR)\police.obj" + -@erase "$(INTDIR)\policeentity.obj" + -@erase "$(INTDIR)\policestate.obj" + -@erase "$(INTDIR)\racecar.obj" + -@erase "$(INTDIR)\racestandsentity.obj" + -@erase "$(INTDIR)\racestate.obj" + -@erase "$(INTDIR)\radio.obj" + -@erase "$(INTDIR)\radiostate.obj" + -@erase "$(INTDIR)\registrationbook.obj" + -@erase "$(INTDIR)\score.obj" + -@erase "$(INTDIR)\skateboard.obj" + -@erase "$(INTDIR)\towtrack.obj" + -@erase "$(INTDIR)\towtrackmissionstate.obj" -@erase "$(INTDIR)\vc40.pdb" -@erase ".\Release\LEGO1.DLL" -@erase ".\Release\LEGO1.EXP" @@ -134,28 +259,153 @@ LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ /pdb:"Release/LEGO1.PDB" /debug /machine:I386 /out:"Release/LEGO1.DLL"\ /implib:"Release/LEGO1.LIB" LINK32_OBJS= \ + "$(INTDIR)\act1state.obj" \ + "$(INTDIR)\act2brick.obj" \ + "$(INTDIR)\act2policestation.obj" \ + "$(INTDIR)\act3.obj" \ + "$(INTDIR)\act3shark.obj" \ + "$(INTDIR)\act3state.obj" \ + "$(INTDIR)\ambulance.obj" \ + "$(INTDIR)\ambulancemissionstate.obj" \ + "$(INTDIR)\animstate.obj" \ + "$(INTDIR)\beachhouseentity.obj" \ + "$(INTDIR)\bike.obj" \ + "$(INTDIR)\buildingentity.obj" \ + "$(INTDIR)\bumpbouy.obj" \ + "$(INTDIR)\carrace.obj" \ "$(INTDIR)\dllmain.obj" \ + "$(INTDIR)\dunebuggy.obj" \ + "$(INTDIR)\elevatorbottom.obj" \ + "$(INTDIR)\gasstation.obj" \ + "$(INTDIR)\gasstationentity.obj" \ + "$(INTDIR)\gasstationstate.obj" \ + "$(INTDIR)\helicopter.obj" \ + "$(INTDIR)\helicopterstate.obj" \ + "$(INTDIR)\historybook.obj" \ + "$(INTDIR)\hospital.obj" \ + "$(INTDIR)\hospitalentity.obj" \ + "$(INTDIR)\hospitalstate.obj" \ + "$(INTDIR)\infocenter.obj" \ + "$(INTDIR)\infocenterdoor.obj" \ + "$(INTDIR)\infocenterentity.obj" \ + "$(INTDIR)\infocenterstate.obj" \ + "$(INTDIR)\isle.obj" \ + "$(INTDIR)\isleactor.obj" \ + "$(INTDIR)\islepathactor.obj" \ + "$(INTDIR)\jetski.obj" \ + "$(INTDIR)\jetskiRace.obj" \ + "$(INTDIR)\jukebox.obj" \ + "$(INTDIR)\jukeboxentity.obj" \ + "$(INTDIR)\jukeboxstate.obj" \ + "$(INTDIR)\legoact2state.obj" \ + "$(INTDIR)\legoactioncontrolpresenter.obj" \ + "$(INTDIR)\legoanimactor.obj" \ + "$(INTDIR)\legoanimationmanager.obj" \ + "$(INTDIR)\legoanimmmpresenter.obj" \ + "$(INTDIR)\legoanimpresenter.obj" \ + "$(INTDIR)\legobuildingmanager.obj" \ + "$(INTDIR)\legocachesound.obj" \ + "$(INTDIR)\legocameracontroller.obj" \ + "$(INTDIR)\legocarbuild.obj" \ + "$(INTDIR)\legocarbuildanimpresenter.obj" \ + "$(INTDIR)\legocontrolmanager.obj" \ + "$(INTDIR)\legoentity.obj" \ + "$(INTDIR)\legoentitypresenter.obj" \ + "$(INTDIR)\legoflctexturepresenter.obj" \ + "$(INTDIR)\legohideanimpresenter.obj" \ + "$(INTDIR)\legoinputmanager.obj" \ + "$(INTDIR)\legojetski.obj" \ + "$(INTDIR)\legoloadcachesoundpresenter.obj" \ + "$(INTDIR)\legolocomotionanimpresenter.obj" \ "$(INTDIR)\legonavcontroller.obj" \ "$(INTDIR)\legoomni.obj" \ + "$(INTDIR)\legopalettepresenter.obj" \ + "$(INTDIR)\legopathactor.obj" \ + "$(INTDIR)\legopathcontroller.obj" \ + "$(INTDIR)\legopathpresenter.obj" \ + "$(INTDIR)\legophonemepresenter.obj" \ + "$(INTDIR)\legoplantmanager.obj" \ + "$(INTDIR)\legorace.obj" \ + "$(INTDIR)\legosoundmanager.obj" \ + "$(INTDIR)\legostate.obj" \ + "$(INTDIR)\legotexturepresenter.obj" \ + "$(INTDIR)\legovideomanager.obj" \ + "$(INTDIR)\legoworld.obj" \ + "$(INTDIR)\legoworldpresenter.obj" \ + "$(INTDIR)\motorcycle.obj" \ "$(INTDIR)\mxatomid.obj" \ + "$(INTDIR)\mxaudiopresenter.obj" \ "$(INTDIR)\mxautolocker.obj" \ + "$(INTDIR)\mxbackgroundaudiomanager.obj" \ + "$(INTDIR)\mxcompositemediapresenter.obj" \ + "$(INTDIR)\mxcompositepresenter.obj" \ + "$(INTDIR)\mxcontrolpresenter.obj" \ "$(INTDIR)\mxcore.obj" \ "$(INTDIR)\mxcriticalsection.obj" \ + "$(INTDIR)\mxdiskstreamcontroller.obj" \ + "$(INTDIR)\mxdiskstreamprovider.obj" \ + "$(INTDIR)\mxdsaction.obj" \ + "$(INTDIR)\mxdsanim.obj" \ + "$(INTDIR)\mxdschunk.obj" \ + "$(INTDIR)\mxdsevent.obj" \ "$(INTDIR)\mxdsfile.obj" \ + "$(INTDIR)\mxdsmediaaction.obj" \ + "$(INTDIR)\mxdsmultiaction.obj" \ "$(INTDIR)\mxdsobject.obj" \ + "$(INTDIR)\mxdsobjectaction.obj" \ + "$(INTDIR)\mxdsparallelaction.obj" \ + "$(INTDIR)\mxdsselectaction.obj" \ + "$(INTDIR)\mxdsserialaction.obj" \ + "$(INTDIR)\mxdssound.obj" \ "$(INTDIR)\mxdssource.obj" \ + "$(INTDIR)\mxdsstill.obj" \ + "$(INTDIR)\mxdssubscriber.obj" \ + "$(INTDIR)\mxentity.obj" \ + "$(INTDIR)\mxeventmanager.obj" \ + "$(INTDIR)\mxeventpresenter.obj" \ + "$(INTDIR)\mxflcpresenter.obj" \ "$(INTDIR)\mxioinfo.obj" \ + "$(INTDIR)\mxloopingflcpresenter.obj" \ + "$(INTDIR)\mxloopingsmkpresenter.obj" \ + "$(INTDIR)\mxmediapresenter.obj" \ + "$(INTDIR)\mxmusicpresenter.obj" \ + "$(INTDIR)\mxnotificationmanager.obj" \ "$(INTDIR)\mxomni.obj" \ "$(INTDIR)\mxomnicreateflags.obj" \ "$(INTDIR)\mxomnicreateparam.obj" \ "$(INTDIR)\mxomnicreateparambase.obj" \ "$(INTDIR)\mxpalette.obj" \ + "$(INTDIR)\mxpresenter.obj" \ + "$(INTDIR)\mxsmkpresenter.obj" \ + "$(INTDIR)\mxsoundmanager.obj" \ + "$(INTDIR)\mxsoundpresenter.obj" \ + "$(INTDIR)\mxstillpresenter.obj" \ + "$(INTDIR)\mxstreamer.obj" \ "$(INTDIR)\mxstring.obj" \ "$(INTDIR)\mxtimer.obj" \ + "$(INTDIR)\mxtransitionmanager.obj" \ "$(INTDIR)\mxunknown100dc6b0.obj" \ "$(INTDIR)\mxvideomanager.obj" \ "$(INTDIR)\mxvideoparam.obj" \ - "$(INTDIR)\mxvideoparamflags.obj" + "$(INTDIR)\mxvideoparamflags.obj" \ + "$(INTDIR)\mxvideopresenter.obj" \ + "$(INTDIR)\mxwavepresenter.obj" \ + "$(INTDIR)\pizza.obj" \ + "$(INTDIR)\pizzeria.obj" \ + "$(INTDIR)\pizzeriastate.obj" \ + "$(INTDIR)\police.obj" \ + "$(INTDIR)\policeentity.obj" \ + "$(INTDIR)\policestate.obj" \ + "$(INTDIR)\racecar.obj" \ + "$(INTDIR)\racestandsentity.obj" \ + "$(INTDIR)\racestate.obj" \ + "$(INTDIR)\radio.obj" \ + "$(INTDIR)\radiostate.obj" \ + "$(INTDIR)\registrationbook.obj" \ + "$(INTDIR)\score.obj" \ + "$(INTDIR)\skateboard.obj" \ + "$(INTDIR)\towtrack.obj" \ + "$(INTDIR)\towtrackmissionstate.obj" ".\Release\LEGO1.DLL" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< @@ -180,28 +430,153 @@ INTDIR=.\LEGO1\Debug ALL : ".\Debug\LEGO1.DLL" CLEAN : + -@erase "$(INTDIR)\act1state.obj" + -@erase "$(INTDIR)\act2brick.obj" + -@erase "$(INTDIR)\act2policestation.obj" + -@erase "$(INTDIR)\act3.obj" + -@erase "$(INTDIR)\act3shark.obj" + -@erase "$(INTDIR)\act3state.obj" + -@erase "$(INTDIR)\ambulance.obj" + -@erase "$(INTDIR)\ambulancemissionstate.obj" + -@erase "$(INTDIR)\animstate.obj" + -@erase "$(INTDIR)\beachhouseentity.obj" + -@erase "$(INTDIR)\bike.obj" + -@erase "$(INTDIR)\buildingentity.obj" + -@erase "$(INTDIR)\bumpbouy.obj" + -@erase "$(INTDIR)\carrace.obj" -@erase "$(INTDIR)\dllmain.obj" + -@erase "$(INTDIR)\dunebuggy.obj" + -@erase "$(INTDIR)\elevatorbottom.obj" + -@erase "$(INTDIR)\gasstation.obj" + -@erase "$(INTDIR)\gasstationentity.obj" + -@erase "$(INTDIR)\gasstationstate.obj" + -@erase "$(INTDIR)\helicopter.obj" + -@erase "$(INTDIR)\helicopterstate.obj" + -@erase "$(INTDIR)\historybook.obj" + -@erase "$(INTDIR)\hospital.obj" + -@erase "$(INTDIR)\hospitalentity.obj" + -@erase "$(INTDIR)\hospitalstate.obj" + -@erase "$(INTDIR)\infocenter.obj" + -@erase "$(INTDIR)\infocenterdoor.obj" + -@erase "$(INTDIR)\infocenterentity.obj" + -@erase "$(INTDIR)\infocenterstate.obj" + -@erase "$(INTDIR)\isle.obj" + -@erase "$(INTDIR)\isleactor.obj" + -@erase "$(INTDIR)\islepathactor.obj" + -@erase "$(INTDIR)\jetski.obj" + -@erase "$(INTDIR)\jetskiRace.obj" + -@erase "$(INTDIR)\jukebox.obj" + -@erase "$(INTDIR)\jukeboxentity.obj" + -@erase "$(INTDIR)\jukeboxstate.obj" + -@erase "$(INTDIR)\legoact2state.obj" + -@erase "$(INTDIR)\legoactioncontrolpresenter.obj" + -@erase "$(INTDIR)\legoanimactor.obj" + -@erase "$(INTDIR)\legoanimationmanager.obj" + -@erase "$(INTDIR)\legoanimmmpresenter.obj" + -@erase "$(INTDIR)\legoanimpresenter.obj" + -@erase "$(INTDIR)\legobuildingmanager.obj" + -@erase "$(INTDIR)\legocachesound.obj" + -@erase "$(INTDIR)\legocameracontroller.obj" + -@erase "$(INTDIR)\legocarbuild.obj" + -@erase "$(INTDIR)\legocarbuildanimpresenter.obj" + -@erase "$(INTDIR)\legocontrolmanager.obj" + -@erase "$(INTDIR)\legoentity.obj" + -@erase "$(INTDIR)\legoentitypresenter.obj" + -@erase "$(INTDIR)\legoflctexturepresenter.obj" + -@erase "$(INTDIR)\legohideanimpresenter.obj" + -@erase "$(INTDIR)\legoinputmanager.obj" + -@erase "$(INTDIR)\legojetski.obj" + -@erase "$(INTDIR)\legoloadcachesoundpresenter.obj" + -@erase "$(INTDIR)\legolocomotionanimpresenter.obj" -@erase "$(INTDIR)\legonavcontroller.obj" -@erase "$(INTDIR)\legoomni.obj" + -@erase "$(INTDIR)\legopalettepresenter.obj" + -@erase "$(INTDIR)\legopathactor.obj" + -@erase "$(INTDIR)\legopathcontroller.obj" + -@erase "$(INTDIR)\legopathpresenter.obj" + -@erase "$(INTDIR)\legophonemepresenter.obj" + -@erase "$(INTDIR)\legoplantmanager.obj" + -@erase "$(INTDIR)\legorace.obj" + -@erase "$(INTDIR)\legosoundmanager.obj" + -@erase "$(INTDIR)\legostate.obj" + -@erase "$(INTDIR)\legotexturepresenter.obj" + -@erase "$(INTDIR)\legovideomanager.obj" + -@erase "$(INTDIR)\legoworld.obj" + -@erase "$(INTDIR)\legoworldpresenter.obj" + -@erase "$(INTDIR)\motorcycle.obj" -@erase "$(INTDIR)\mxatomid.obj" + -@erase "$(INTDIR)\mxaudiopresenter.obj" -@erase "$(INTDIR)\mxautolocker.obj" + -@erase "$(INTDIR)\mxbackgroundaudiomanager.obj" + -@erase "$(INTDIR)\mxcompositemediapresenter.obj" + -@erase "$(INTDIR)\mxcompositepresenter.obj" + -@erase "$(INTDIR)\mxcontrolpresenter.obj" -@erase "$(INTDIR)\mxcore.obj" -@erase "$(INTDIR)\mxcriticalsection.obj" + -@erase "$(INTDIR)\mxdiskstreamcontroller.obj" + -@erase "$(INTDIR)\mxdiskstreamprovider.obj" + -@erase "$(INTDIR)\mxdsaction.obj" + -@erase "$(INTDIR)\mxdsanim.obj" + -@erase "$(INTDIR)\mxdschunk.obj" + -@erase "$(INTDIR)\mxdsevent.obj" -@erase "$(INTDIR)\mxdsfile.obj" + -@erase "$(INTDIR)\mxdsmediaaction.obj" + -@erase "$(INTDIR)\mxdsmultiaction.obj" -@erase "$(INTDIR)\mxdsobject.obj" + -@erase "$(INTDIR)\mxdsobjectaction.obj" + -@erase "$(INTDIR)\mxdsparallelaction.obj" + -@erase "$(INTDIR)\mxdsselectaction.obj" + -@erase "$(INTDIR)\mxdsserialaction.obj" + -@erase "$(INTDIR)\mxdssound.obj" -@erase "$(INTDIR)\mxdssource.obj" + -@erase "$(INTDIR)\mxdsstill.obj" + -@erase "$(INTDIR)\mxdssubscriber.obj" + -@erase "$(INTDIR)\mxentity.obj" + -@erase "$(INTDIR)\mxeventmanager.obj" + -@erase "$(INTDIR)\mxeventpresenter.obj" + -@erase "$(INTDIR)\mxflcpresenter.obj" -@erase "$(INTDIR)\mxioinfo.obj" + -@erase "$(INTDIR)\mxloopingflcpresenter.obj" + -@erase "$(INTDIR)\mxloopingsmkpresenter.obj" + -@erase "$(INTDIR)\mxmediapresenter.obj" + -@erase "$(INTDIR)\mxmusicpresenter.obj" + -@erase "$(INTDIR)\mxnotificationmanager.obj" -@erase "$(INTDIR)\mxomni.obj" -@erase "$(INTDIR)\mxomnicreateflags.obj" -@erase "$(INTDIR)\mxomnicreateparam.obj" -@erase "$(INTDIR)\mxomnicreateparambase.obj" -@erase "$(INTDIR)\mxpalette.obj" + -@erase "$(INTDIR)\mxpresenter.obj" + -@erase "$(INTDIR)\mxsmkpresenter.obj" + -@erase "$(INTDIR)\mxsoundmanager.obj" + -@erase "$(INTDIR)\mxsoundpresenter.obj" + -@erase "$(INTDIR)\mxstillpresenter.obj" + -@erase "$(INTDIR)\mxstreamer.obj" -@erase "$(INTDIR)\mxstring.obj" -@erase "$(INTDIR)\mxtimer.obj" + -@erase "$(INTDIR)\mxtransitionmanager.obj" -@erase "$(INTDIR)\mxunknown100dc6b0.obj" -@erase "$(INTDIR)\mxvideomanager.obj" -@erase "$(INTDIR)\mxvideoparam.obj" -@erase "$(INTDIR)\mxvideoparamflags.obj" + -@erase "$(INTDIR)\mxvideopresenter.obj" + -@erase "$(INTDIR)\mxwavepresenter.obj" + -@erase "$(INTDIR)\pizza.obj" + -@erase "$(INTDIR)\pizzeria.obj" + -@erase "$(INTDIR)\pizzeriastate.obj" + -@erase "$(INTDIR)\police.obj" + -@erase "$(INTDIR)\policeentity.obj" + -@erase "$(INTDIR)\policestate.obj" + -@erase "$(INTDIR)\racecar.obj" + -@erase "$(INTDIR)\racestandsentity.obj" + -@erase "$(INTDIR)\racestate.obj" + -@erase "$(INTDIR)\radio.obj" + -@erase "$(INTDIR)\radiostate.obj" + -@erase "$(INTDIR)\registrationbook.obj" + -@erase "$(INTDIR)\score.obj" + -@erase "$(INTDIR)\skateboard.obj" + -@erase "$(INTDIR)\towtrack.obj" + -@erase "$(INTDIR)\towtrackmissionstate.obj" -@erase "$(INTDIR)\vc40.idb" -@erase "$(INTDIR)\vc40.pdb" -@erase "$(OUTDIR)\LEGO1.exp" @@ -262,28 +637,153 @@ LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ /pdb:"$(OUTDIR)/LEGO1.pdb" /debug /machine:I386 /out:"Debug/LEGO1.DLL"\ /implib:"$(OUTDIR)/LEGO1.lib" LINK32_OBJS= \ + "$(INTDIR)\act1state.obj" \ + "$(INTDIR)\act2brick.obj" \ + "$(INTDIR)\act2policestation.obj" \ + "$(INTDIR)\act3.obj" \ + "$(INTDIR)\act3shark.obj" \ + "$(INTDIR)\act3state.obj" \ + "$(INTDIR)\ambulance.obj" \ + "$(INTDIR)\ambulancemissionstate.obj" \ + "$(INTDIR)\animstate.obj" \ + "$(INTDIR)\beachhouseentity.obj" \ + "$(INTDIR)\bike.obj" \ + "$(INTDIR)\buildingentity.obj" \ + "$(INTDIR)\bumpbouy.obj" \ + "$(INTDIR)\carrace.obj" \ "$(INTDIR)\dllmain.obj" \ + "$(INTDIR)\dunebuggy.obj" \ + "$(INTDIR)\elevatorbottom.obj" \ + "$(INTDIR)\gasstation.obj" \ + "$(INTDIR)\gasstationentity.obj" \ + "$(INTDIR)\gasstationstate.obj" \ + "$(INTDIR)\helicopter.obj" \ + "$(INTDIR)\helicopterstate.obj" \ + "$(INTDIR)\historybook.obj" \ + "$(INTDIR)\hospital.obj" \ + "$(INTDIR)\hospitalentity.obj" \ + "$(INTDIR)\hospitalstate.obj" \ + "$(INTDIR)\infocenter.obj" \ + "$(INTDIR)\infocenterdoor.obj" \ + "$(INTDIR)\infocenterentity.obj" \ + "$(INTDIR)\infocenterstate.obj" \ + "$(INTDIR)\isle.obj" \ + "$(INTDIR)\isleactor.obj" \ + "$(INTDIR)\islepathactor.obj" \ + "$(INTDIR)\jetski.obj" \ + "$(INTDIR)\jetskiRace.obj" \ + "$(INTDIR)\jukebox.obj" \ + "$(INTDIR)\jukeboxentity.obj" \ + "$(INTDIR)\jukeboxstate.obj" \ + "$(INTDIR)\legoact2state.obj" \ + "$(INTDIR)\legoactioncontrolpresenter.obj" \ + "$(INTDIR)\legoanimactor.obj" \ + "$(INTDIR)\legoanimationmanager.obj" \ + "$(INTDIR)\legoanimmmpresenter.obj" \ + "$(INTDIR)\legoanimpresenter.obj" \ + "$(INTDIR)\legobuildingmanager.obj" \ + "$(INTDIR)\legocachesound.obj" \ + "$(INTDIR)\legocameracontroller.obj" \ + "$(INTDIR)\legocarbuild.obj" \ + "$(INTDIR)\legocarbuildanimpresenter.obj" \ + "$(INTDIR)\legocontrolmanager.obj" \ + "$(INTDIR)\legoentity.obj" \ + "$(INTDIR)\legoentitypresenter.obj" \ + "$(INTDIR)\legoflctexturepresenter.obj" \ + "$(INTDIR)\legohideanimpresenter.obj" \ + "$(INTDIR)\legoinputmanager.obj" \ + "$(INTDIR)\legojetski.obj" \ + "$(INTDIR)\legoloadcachesoundpresenter.obj" \ + "$(INTDIR)\legolocomotionanimpresenter.obj" \ "$(INTDIR)\legonavcontroller.obj" \ "$(INTDIR)\legoomni.obj" \ + "$(INTDIR)\legopalettepresenter.obj" \ + "$(INTDIR)\legopathactor.obj" \ + "$(INTDIR)\legopathcontroller.obj" \ + "$(INTDIR)\legopathpresenter.obj" \ + "$(INTDIR)\legophonemepresenter.obj" \ + "$(INTDIR)\legoplantmanager.obj" \ + "$(INTDIR)\legorace.obj" \ + "$(INTDIR)\legosoundmanager.obj" \ + "$(INTDIR)\legostate.obj" \ + "$(INTDIR)\legotexturepresenter.obj" \ + "$(INTDIR)\legovideomanager.obj" \ + "$(INTDIR)\legoworld.obj" \ + "$(INTDIR)\legoworldpresenter.obj" \ + "$(INTDIR)\motorcycle.obj" \ "$(INTDIR)\mxatomid.obj" \ + "$(INTDIR)\mxaudiopresenter.obj" \ "$(INTDIR)\mxautolocker.obj" \ + "$(INTDIR)\mxbackgroundaudiomanager.obj" \ + "$(INTDIR)\mxcompositemediapresenter.obj" \ + "$(INTDIR)\mxcompositepresenter.obj" \ + "$(INTDIR)\mxcontrolpresenter.obj" \ "$(INTDIR)\mxcore.obj" \ "$(INTDIR)\mxcriticalsection.obj" \ + "$(INTDIR)\mxdiskstreamcontroller.obj" \ + "$(INTDIR)\mxdiskstreamprovider.obj" \ + "$(INTDIR)\mxdsaction.obj" \ + "$(INTDIR)\mxdsanim.obj" \ + "$(INTDIR)\mxdschunk.obj" \ + "$(INTDIR)\mxdsevent.obj" \ "$(INTDIR)\mxdsfile.obj" \ + "$(INTDIR)\mxdsmediaaction.obj" \ + "$(INTDIR)\mxdsmultiaction.obj" \ "$(INTDIR)\mxdsobject.obj" \ + "$(INTDIR)\mxdsobjectaction.obj" \ + "$(INTDIR)\mxdsparallelaction.obj" \ + "$(INTDIR)\mxdsselectaction.obj" \ + "$(INTDIR)\mxdsserialaction.obj" \ + "$(INTDIR)\mxdssound.obj" \ "$(INTDIR)\mxdssource.obj" \ + "$(INTDIR)\mxdsstill.obj" \ + "$(INTDIR)\mxdssubscriber.obj" \ + "$(INTDIR)\mxentity.obj" \ + "$(INTDIR)\mxeventmanager.obj" \ + "$(INTDIR)\mxeventpresenter.obj" \ + "$(INTDIR)\mxflcpresenter.obj" \ "$(INTDIR)\mxioinfo.obj" \ + "$(INTDIR)\mxloopingflcpresenter.obj" \ + "$(INTDIR)\mxloopingsmkpresenter.obj" \ + "$(INTDIR)\mxmediapresenter.obj" \ + "$(INTDIR)\mxmusicpresenter.obj" \ + "$(INTDIR)\mxnotificationmanager.obj" \ "$(INTDIR)\mxomni.obj" \ "$(INTDIR)\mxomnicreateflags.obj" \ "$(INTDIR)\mxomnicreateparam.obj" \ "$(INTDIR)\mxomnicreateparambase.obj" \ "$(INTDIR)\mxpalette.obj" \ + "$(INTDIR)\mxpresenter.obj" \ + "$(INTDIR)\mxsmkpresenter.obj" \ + "$(INTDIR)\mxsoundmanager.obj" \ + "$(INTDIR)\mxsoundpresenter.obj" \ + "$(INTDIR)\mxstillpresenter.obj" \ + "$(INTDIR)\mxstreamer.obj" \ "$(INTDIR)\mxstring.obj" \ "$(INTDIR)\mxtimer.obj" \ + "$(INTDIR)\mxtransitionmanager.obj" \ "$(INTDIR)\mxunknown100dc6b0.obj" \ "$(INTDIR)\mxvideomanager.obj" \ "$(INTDIR)\mxvideoparam.obj" \ - "$(INTDIR)\mxvideoparamflags.obj" + "$(INTDIR)\mxvideoparamflags.obj" \ + "$(INTDIR)\mxvideopresenter.obj" \ + "$(INTDIR)\mxwavepresenter.obj" \ + "$(INTDIR)\pizza.obj" \ + "$(INTDIR)\pizzeria.obj" \ + "$(INTDIR)\pizzeriastate.obj" \ + "$(INTDIR)\police.obj" \ + "$(INTDIR)\policeentity.obj" \ + "$(INTDIR)\policestate.obj" \ + "$(INTDIR)\racecar.obj" \ + "$(INTDIR)\racestandsentity.obj" \ + "$(INTDIR)\racestate.obj" \ + "$(INTDIR)\radio.obj" \ + "$(INTDIR)\radiostate.obj" \ + "$(INTDIR)\registrationbook.obj" \ + "$(INTDIR)\score.obj" \ + "$(INTDIR)\skateboard.obj" \ + "$(INTDIR)\towtrack.obj" \ + "$(INTDIR)\towtrackmissionstate.obj" ".\Debug\LEGO1.DLL" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< @@ -309,8 +809,8 @@ ALL : "LEGO1 - Win32 Release" ".\Release\ISLE.EXE" CLEAN : -@erase "$(INTDIR)\define.obj" - -@erase "$(INTDIR)\isle.obj" -@erase "$(INTDIR)\isle.res" + -@erase "$(INTDIR)\isleapp.obj" -@erase "$(INTDIR)\vc40.pdb" -@erase ".\Release\ISLE.EXE" -@erase ".\Release\ISLE.PDB" @@ -369,8 +869,8 @@ LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ /out:"Release/ISLE.EXE" /LIBPATH:"ISLE/ext" LINK32_OBJS= \ "$(INTDIR)\define.obj" \ - "$(INTDIR)\isle.obj" \ "$(INTDIR)\isle.res" \ + "$(INTDIR)\isleapp.obj" \ ".\Release\LEGO1.LIB" ".\Release\ISLE.EXE" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) @@ -397,8 +897,8 @@ ALL : "LEGO1 - Win32 Debug" ".\Debug\ISLE.EXE" CLEAN : -@erase "$(INTDIR)\define.obj" - -@erase "$(INTDIR)\isle.obj" -@erase "$(INTDIR)\isle.res" + -@erase "$(INTDIR)\isleapp.obj" -@erase "$(INTDIR)\vc40.idb" -@erase "$(INTDIR)\vc40.pdb" -@erase ".\Debug\ISLE.EXE" @@ -459,8 +959,8 @@ LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ /out:"Debug/ISLE.EXE" /LIBPATH:"ISLE/ext" LINK32_OBJS= \ "$(INTDIR)\define.obj" \ - "$(INTDIR)\isle.obj" \ "$(INTDIR)\isle.res" \ + "$(INTDIR)\isleapp.obj" \ ".\LEGO1\Debug\LEGO1.lib" ".\Debug\ISLE.EXE" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) @@ -511,15 +1011,19 @@ SOURCE=.\LEGO1\dllmain.cpp SOURCE=.\LEGO1\legoomni.cpp DEP_CPP_LEGOO=\ + ".\LEGO1\isle.h"\ ".\LEGO1\lego3dmanager.h"\ ".\LEGO1\lego3dview.h"\ + ".\LEGO1\legobuildingmanager.h"\ ".\LEGO1\legoentity.h"\ ".\LEGO1\legogamestate.h"\ ".\LEGO1\legoinputmanager.h"\ ".\LEGO1\legonavcontroller.h"\ ".\LEGO1\legoomni.h"\ + ".\LEGO1\legoplantmanager.h"\ ".\LEGO1\legoroi.h"\ ".\LEGO1\legovideomanager.h"\ + ".\LEGO1\legoworld.h"\ ".\LEGO1\mxatomid.h"\ ".\LEGO1\mxbackgroundaudiomanager.h"\ ".\LEGO1\mxcore.h"\ @@ -528,6 +1032,7 @@ DEP_CPP_LEGOO=\ ".\LEGO1\mxdsfile.h"\ ".\LEGO1\mxdsobject.h"\ ".\LEGO1\mxdssource.h"\ + ".\LEGO1\mxentity.h"\ ".\LEGO1\mxeventmanager.h"\ ".\LEGO1\mxioinfo.h"\ ".\LEGO1\mxmusicmanager.h"\ @@ -539,7 +1044,6 @@ DEP_CPP_LEGOO=\ ".\LEGO1\mxomnicreateparambase.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxsoundmanager.h"\ ".\LEGO1\mxstreamcontroller.h"\ ".\LEGO1\mxstreamer.h"\ @@ -621,7 +1125,6 @@ DEP_CPP_MXOMN=\ ".\LEGO1\mxomnicreateparambase.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxsoundmanager.h"\ ".\LEGO1\mxstreamcontroller.h"\ ".\LEGO1\mxstreamer.h"\ @@ -649,7 +1152,6 @@ DEP_CPP_MXVID=\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxvariabletable.h"\ ".\LEGO1\mxvideoparam.h"\ @@ -685,7 +1187,6 @@ DEP_CPP_MXOMNI=\ ".\LEGO1\mxomnicreateparambase.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxstring.h"\ ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxvariabletable.h"\ @@ -709,7 +1210,6 @@ DEP_CPP_MXOMNIC=\ ".\LEGO1\mxomnicreateparambase.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxstring.h"\ ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxvariabletable.h"\ @@ -757,16 +1257,20 @@ DEP_CPP_MXOMNICR=\ SOURCE=.\LEGO1\legonavcontroller.cpp DEP_CPP_LEGON=\ + ".\LEGO1\isle.h"\ ".\LEGO1\lego3dmanager.h"\ ".\LEGO1\lego3dview.h"\ + ".\LEGO1\legobuildingmanager.h"\ ".\LEGO1\legoentity.h"\ ".\LEGO1\legogamestate.h"\ ".\LEGO1\legoinputmanager.h"\ ".\LEGO1\legonavcontroller.h"\ ".\LEGO1\legoomni.h"\ + ".\LEGO1\legoplantmanager.h"\ ".\LEGO1\legoroi.h"\ ".\LEGO1\legoutil.h"\ ".\LEGO1\legovideomanager.h"\ + ".\LEGO1\legoworld.h"\ ".\LEGO1\mxatomid.h"\ ".\LEGO1\mxbackgroundaudiomanager.h"\ ".\LEGO1\mxcore.h"\ @@ -775,6 +1279,7 @@ DEP_CPP_LEGON=\ ".\LEGO1\mxdsfile.h"\ ".\LEGO1\mxdsobject.h"\ ".\LEGO1\mxdssource.h"\ + ".\LEGO1\mxentity.h"\ ".\LEGO1\mxeventmanager.h"\ ".\LEGO1\mxioinfo.h"\ ".\LEGO1\mxmusicmanager.h"\ @@ -786,7 +1291,6 @@ DEP_CPP_LEGON=\ ".\LEGO1\mxomnicreateparambase.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxsoundmanager.h"\ ".\LEGO1\mxstreamcontroller.h"\ ".\LEGO1\mxstreamer.h"\ @@ -844,7 +1348,6 @@ SOURCE=.\LEGO1\mxunknown100dc6b0.cpp DEP_CPP_MXUNK=\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxunknown100dc6b0.h"\ @@ -863,7 +1366,6 @@ DEP_CPP_MXVIDEO=\ ".\LEGO1\mxcriticalsection.h"\ ".\LEGO1\mxpalette.h"\ ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxtypes.h"\ ".\LEGO1\mxunknown100dc6b0.h"\ ".\LEGO1\mxvariabletable.h"\ @@ -884,7 +1386,6 @@ SOURCE=.\LEGO1\mxpalette.cpp DEP_CPP_MXPAL=\ ".\LEGO1\mxcore.h"\ ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxresult.h"\ ".\LEGO1\mxtypes.h"\ @@ -896,12 +1397,1228 @@ DEP_CPP_MXPAL=\ ################################################################################ # Begin Source File -SOURCE=.\LEGO1\mxioinfo.cpp -DEP_CPP_MXIOI=\ - ".\LEGO1\mxioinfo.h"\ +SOURCE=.\LEGO1\act1state.cpp +DEP_CPP_ACT1S=\ + ".\LEGO1\act1state.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ -"$(INTDIR)\mxioinfo.obj" : $(SOURCE) $(DEP_CPP_MXIOI) "$(INTDIR)" +"$(INTDIR)\act1state.obj" : $(SOURCE) $(DEP_CPP_ACT1S) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\act2brick.cpp +DEP_CPP_ACT2B=\ + ".\LEGO1\act2brick.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\act2brick.obj" : $(SOURCE) $(DEP_CPP_ACT2B) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\act2policestation.cpp +DEP_CPP_ACT2P=\ + ".\LEGO1\act2policestation.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\act2policestation.obj" : $(SOURCE) $(DEP_CPP_ACT2P) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\act3.cpp +DEP_CPP_ACT3_=\ + ".\LEGO1\act3.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\act3.obj" : $(SOURCE) $(DEP_CPP_ACT3_) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\act3shark.cpp +DEP_CPP_ACT3S=\ + ".\LEGO1\act3shark.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoanimactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\act3shark.obj" : $(SOURCE) $(DEP_CPP_ACT3S) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\ambulance.cpp +DEP_CPP_AMBUL=\ + ".\LEGO1\ambulance.h"\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\ambulance.obj" : $(SOURCE) $(DEP_CPP_AMBUL) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\ambulancemissionstate.cpp +DEP_CPP_AMBULA=\ + ".\LEGO1\ambulancemissionstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\ambulancemissionstate.obj" : $(SOURCE) $(DEP_CPP_AMBULA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\animstate.cpp +DEP_CPP_ANIMS=\ + ".\LEGO1\animstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\animstate.obj" : $(SOURCE) $(DEP_CPP_ANIMS) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\beachhouseentity.cpp +DEP_CPP_BEACH=\ + ".\LEGO1\beachhouseentity.h"\ + ".\LEGO1\buildingentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\beachhouseentity.obj" : $(SOURCE) $(DEP_CPP_BEACH) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\bike.cpp +DEP_CPP_BIKE_=\ + ".\LEGO1\bike.h"\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\bike.obj" : $(SOURCE) $(DEP_CPP_BIKE_) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\buildingentity.cpp +DEP_CPP_BUILD=\ + ".\LEGO1\buildingentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\buildingentity.obj" : $(SOURCE) $(DEP_CPP_BUILD) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\bumpbouy.cpp +DEP_CPP_BUMPB=\ + ".\LEGO1\bumpbouy.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoanimactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\bumpbouy.obj" : $(SOURCE) $(DEP_CPP_BUMPB) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\carrace.cpp +DEP_CPP_CARRA=\ + ".\LEGO1\carrace.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legorace.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\carrace.obj" : $(SOURCE) $(DEP_CPP_CARRA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\dunebuggy.cpp +DEP_CPP_DUNEB=\ + ".\LEGO1\dunebuggy.h"\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\dunebuggy.obj" : $(SOURCE) $(DEP_CPP_DUNEB) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\elevatorbottom.cpp +DEP_CPP_ELEVA=\ + ".\LEGO1\elevatorbottom.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\elevatorbottom.obj" : $(SOURCE) $(DEP_CPP_ELEVA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\gasstation.cpp +DEP_CPP_GASST=\ + ".\LEGO1\gasstation.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\gasstation.obj" : $(SOURCE) $(DEP_CPP_GASST) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\gasstationentity.cpp +DEP_CPP_GASSTA=\ + ".\LEGO1\buildingentity.h"\ + ".\LEGO1\gasstationentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\gasstationentity.obj" : $(SOURCE) $(DEP_CPP_GASSTA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\gasstationstate.cpp +DEP_CPP_GASSTAT=\ + ".\LEGO1\gasstationstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\gasstationstate.obj" : $(SOURCE) $(DEP_CPP_GASSTAT) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\helicopter.cpp +DEP_CPP_HELIC=\ + ".\LEGO1\helicopter.h"\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\helicopter.obj" : $(SOURCE) $(DEP_CPP_HELIC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\historybook.cpp +DEP_CPP_HISTO=\ + ".\LEGO1\historybook.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\historybook.obj" : $(SOURCE) $(DEP_CPP_HISTO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\hospital.cpp +DEP_CPP_HOSPI=\ + ".\LEGO1\hospital.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\hospital.obj" : $(SOURCE) $(DEP_CPP_HOSPI) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\hospitalentity.cpp +DEP_CPP_HOSPIT=\ + ".\LEGO1\buildingentity.h"\ + ".\LEGO1\hospitalentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\hospitalentity.obj" : $(SOURCE) $(DEP_CPP_HOSPIT) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\hospitalstate.cpp +DEP_CPP_HOSPITA=\ + ".\LEGO1\hospitalstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\hospitalstate.obj" : $(SOURCE) $(DEP_CPP_HOSPITA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\infocenter.cpp +DEP_CPP_INFOC=\ + ".\LEGO1\infocenter.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\infocenter.obj" : $(SOURCE) $(DEP_CPP_INFOC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\infocenterdoor.cpp +DEP_CPP_INFOCE=\ + ".\LEGO1\infocenterdoor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\infocenterdoor.obj" : $(SOURCE) $(DEP_CPP_INFOCE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\infocenterentity.cpp +DEP_CPP_INFOCEN=\ + ".\LEGO1\buildingentity.h"\ + ".\LEGO1\infocenterentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\infocenterentity.obj" : $(SOURCE) $(DEP_CPP_INFOCEN) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\infocenterstate.cpp +DEP_CPP_INFOCENT=\ + ".\LEGO1\infocenterstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\infocenterstate.obj" : $(SOURCE) $(DEP_CPP_INFOCENT) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\isle.cpp +DEP_CPP_ISLE_=\ + ".\LEGO1\isle.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\isle.obj" : $(SOURCE) $(DEP_CPP_ISLE_) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\isleactor.cpp +DEP_CPP_ISLEA=\ + ".\LEGO1\isleactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\isleactor.obj" : $(SOURCE) $(DEP_CPP_ISLEA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\islepathactor.cpp +DEP_CPP_ISLEP=\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\islepathactor.obj" : $(SOURCE) $(DEP_CPP_ISLEP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\jetski.cpp +DEP_CPP_JETSK=\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\jetski.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\jetski.obj" : $(SOURCE) $(DEP_CPP_JETSK) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\jetskiRace.cpp +DEP_CPP_JETSKI=\ + ".\LEGO1\jetskiRace.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legorace.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\jetskiRace.obj" : $(SOURCE) $(DEP_CPP_JETSKI) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\jukebox.cpp +DEP_CPP_JUKEB=\ + ".\LEGO1\jukebox.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\jukebox.obj" : $(SOURCE) $(DEP_CPP_JUKEB) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\jukeboxentity.cpp +DEP_CPP_JUKEBO=\ + ".\LEGO1\jukeboxentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\jukeboxentity.obj" : $(SOURCE) $(DEP_CPP_JUKEBO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoactioncontrolpresenter.cpp +DEP_CPP_LEGOA=\ + ".\LEGO1\legoactioncontrolpresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoactioncontrolpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOA)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoanimactor.cpp +DEP_CPP_LEGOAN=\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoanimactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoanimactor.obj" : $(SOURCE) $(DEP_CPP_LEGOAN) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoanimationmanager.cpp +DEP_CPP_LEGOANI=\ + ".\LEGO1\legoanimationmanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoanimationmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOANI) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoanimmmpresenter.cpp +DEP_CPP_LEGOANIM=\ + ".\LEGO1\legoanimmmpresenter.h"\ + ".\LEGO1\mxcompositepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoanimmmpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOANIM) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoanimpresenter.cpp +DEP_CPP_LEGOANIMP=\ + ".\LEGO1\legoanimpresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\legoanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOANIMP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legobuildingmanager.cpp +DEP_CPP_LEGOB=\ + ".\LEGO1\legobuildingmanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legobuildingmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOB) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legocachesound.cpp +DEP_CPP_LEGOC=\ + ".\LEGO1\legocachesound.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legocachesound.obj" : $(SOURCE) $(DEP_CPP_LEGOC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legocameracontroller.cpp +DEP_CPP_LEGOCA=\ + ".\LEGO1\legocameracontroller.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legocameracontroller.obj" : $(SOURCE) $(DEP_CPP_LEGOCA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legocarbuild.cpp +DEP_CPP_LEGOCAR=\ + ".\LEGO1\legocarbuild.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legocarbuild.obj" : $(SOURCE) $(DEP_CPP_LEGOCAR) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legocarbuildanimpresenter.cpp +DEP_CPP_LEGOCARB=\ + ".\LEGO1\legoanimpresenter.h"\ + ".\LEGO1\legocarbuildanimpresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\legocarbuildanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOCARB)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legocontrolmanager.cpp +DEP_CPP_LEGOCO=\ + ".\LEGO1\legocontrolmanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legocontrolmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOCO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoentity.cpp +DEP_CPP_LEGOE=\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoentity.obj" : $(SOURCE) $(DEP_CPP_LEGOE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoentitypresenter.cpp +DEP_CPP_LEGOEN=\ + ".\LEGO1\legoentitypresenter.h"\ + ".\LEGO1\mxcompositepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoentitypresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOEN) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoflctexturepresenter.cpp +DEP_CPP_LEGOF=\ + ".\LEGO1\legoflctexturepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxflcpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\legoflctexturepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOF)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legohideanimpresenter.cpp +DEP_CPP_LEGOH=\ + ".\LEGO1\legoanimpresenter.h"\ + ".\LEGO1\legohideanimpresenter.h"\ + ".\LEGO1\legoloopinganimpresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\legohideanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOH) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoinputmanager.cpp +DEP_CPP_LEGOI=\ + ".\LEGO1\legoinputmanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoinputmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOI) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legojetski.cpp +DEP_CPP_LEGOJ=\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoanimactor.h"\ + ".\LEGO1\legocarraceactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legojetski.h"\ + ".\LEGO1\legojetskiraceactor.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\legoraceactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legojetski.obj" : $(SOURCE) $(DEP_CPP_LEGOJ) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoloadcachesoundpresenter.cpp +DEP_CPP_LEGOL=\ + ".\LEGO1\legoloadcachesoundpresenter.h"\ + ".\LEGO1\mxaudiopresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxsoundpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxwavepresenter.h"\ + + +"$(INTDIR)\legoloadcachesoundpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOL)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legolocomotionanimpresenter.cpp +DEP_CPP_LEGOLO=\ + ".\LEGO1\legoanimpresenter.h"\ + ".\LEGO1\legolocomotionanimpresenter.h"\ + ".\LEGO1\legoloopinganimpresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\legolocomotionanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOLO)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legopalettepresenter.cpp +DEP_CPP_LEGOP=\ + ".\LEGO1\legopalettepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\legopalettepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legopathactor.cpp +DEP_CPP_LEGOPA=\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legopathactor.obj" : $(SOURCE) $(DEP_CPP_LEGOPA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legopathpresenter.cpp +DEP_CPP_LEGOPAT=\ + ".\LEGO1\legopathpresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legopathpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOPAT) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legophonemepresenter.cpp +DEP_CPP_LEGOPH=\ + ".\LEGO1\legophonemepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxflcpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\legophonemepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOPH) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoplantmanager.cpp +DEP_CPP_LEGOPL=\ + ".\LEGO1\legoplantmanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoplantmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOPL) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legorace.cpp +DEP_CPP_LEGOR=\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legorace.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legorace.obj" : $(SOURCE) $(DEP_CPP_LEGOR) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legosoundmanager.cpp +DEP_CPP_LEGOS=\ + ".\LEGO1\legosoundmanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxsoundmanager.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legosoundmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOS) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legotexturepresenter.cpp +DEP_CPP_LEGOT=\ + ".\LEGO1\legotexturepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legotexturepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOT) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoworld.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_LEGOW=\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoworld.obj" : $(SOURCE) $(DEP_CPP_LEGOW) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_LEGOW=\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoworld.obj" : $(SOURCE) $(DEP_CPP_LEGOW) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoworldpresenter.cpp +DEP_CPP_LEGOWO=\ + ".\LEGO1\legoentitypresenter.h"\ + ".\LEGO1\legoworldpresenter.h"\ + ".\LEGO1\mxcompositepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoworldpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOWO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\motorcycle.cpp +DEP_CPP_MOTOR=\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\motorcycle.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\motorcycle.obj" : $(SOURCE) $(DEP_CPP_MOTOR) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxcontrolpresenter.cpp +DEP_CPP_MXCON=\ + ".\LEGO1\mxcompositepresenter.h"\ + ".\LEGO1\mxcontrolpresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxcontrolpresenter.obj" : $(SOURCE) $(DEP_CPP_MXCON) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdiskstreamcontroller.cpp +DEP_CPP_MXDIS=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdiskstreamcontroller.h"\ + ".\LEGO1\mxstreamcontroller.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdiskstreamcontroller.obj" : $(SOURCE) $(DEP_CPP_MXDIS) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdschunk.cpp +DEP_CPP_MXDSC=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdschunk.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdschunk.obj" : $(SOURCE) $(DEP_CPP_MXDSC) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) @@ -923,6 +2640,691 @@ DEP_CPP_MXDSF=\ $(CPP) $(CPP_PROJ) $(SOURCE) +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxentity.cpp +DEP_CPP_MXENT=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxentity.obj" : $(SOURCE) $(DEP_CPP_MXENT) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxeventmanager.cpp +DEP_CPP_MXEVE=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxeventmanager.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxunknown100dc6b0.h"\ + + +"$(INTDIR)\mxeventmanager.obj" : $(SOURCE) $(DEP_CPP_MXEVE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxeventpresenter.cpp +DEP_CPP_MXEVEN=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxeventpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxeventpresenter.obj" : $(SOURCE) $(DEP_CPP_MXEVEN) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxflcpresenter.cpp +DEP_CPP_MXFLC=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxflcpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxflcpresenter.obj" : $(SOURCE) $(DEP_CPP_MXFLC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxloopingsmkpresenter.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXLOO=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxloopingsmkpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxsmkpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxloopingsmkpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXLOO=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxloopingsmkpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxsmkpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxloopingsmkpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxmediapresenter.cpp +DEP_CPP_MXMED=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxmediapresenter.obj" : $(SOURCE) $(DEP_CPP_MXMED) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxmusicpresenter.cpp +DEP_CPP_MXMUS=\ + ".\LEGO1\mxaudiopresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxmusicpresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxmusicpresenter.obj" : $(SOURCE) $(DEP_CPP_MXMUS) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxnotificationmanager.cpp +DEP_CPP_MXNOT=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxnotificationmanager.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxnotificationmanager.obj" : $(SOURCE) $(DEP_CPP_MXNOT) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxpresenter.cpp +DEP_CPP_MXPRE=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxpresenter.obj" : $(SOURCE) $(DEP_CPP_MXPRE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxsmkpresenter.cpp +DEP_CPP_MXSMK=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxsmkpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxsmkpresenter.obj" : $(SOURCE) $(DEP_CPP_MXSMK) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxsoundmanager.cpp +DEP_CPP_MXSOU=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxsoundmanager.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxsoundmanager.obj" : $(SOURCE) $(DEP_CPP_MXSOU) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxstillpresenter.cpp +DEP_CPP_MXSTI=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxstillpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxstillpresenter.obj" : $(SOURCE) $(DEP_CPP_MXSTI) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxstreamer.cpp +DEP_CPP_MXSTRE=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxstreamcontroller.h"\ + ".\LEGO1\mxstreamer.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxstreamer.obj" : $(SOURCE) $(DEP_CPP_MXSTRE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxtransitionmanager.cpp +DEP_CPP_MXTRA=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtransitionmanager.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxtransitionmanager.obj" : $(SOURCE) $(DEP_CPP_MXTRA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxvideopresenter.cpp +DEP_CPP_MXVIDEOP=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxvideopresenter.obj" : $(SOURCE) $(DEP_CPP_MXVIDEOP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxwavepresenter.cpp +DEP_CPP_MXWAV=\ + ".\LEGO1\mxaudiopresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxsoundpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxwavepresenter.h"\ + + +"$(INTDIR)\mxwavepresenter.obj" : $(SOURCE) $(DEP_CPP_MXWAV) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\pizza.cpp +DEP_CPP_PIZZA=\ + ".\LEGO1\isleactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\pizza.h"\ + + +"$(INTDIR)\pizza.obj" : $(SOURCE) $(DEP_CPP_PIZZA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\pizzeria.cpp +DEP_CPP_PIZZE=\ + ".\LEGO1\isleactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\pizzeria.h"\ + + +"$(INTDIR)\pizzeria.obj" : $(SOURCE) $(DEP_CPP_PIZZE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\pizzeriastate.cpp +DEP_CPP_PIZZER=\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\pizzeriastate.h"\ + + +"$(INTDIR)\pizzeriastate.obj" : $(SOURCE) $(DEP_CPP_PIZZER) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\police.cpp +DEP_CPP_POLIC=\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\police.h"\ + + +"$(INTDIR)\police.obj" : $(SOURCE) $(DEP_CPP_POLIC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\policeentity.cpp +DEP_CPP_POLICE=\ + ".\LEGO1\buildingentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\policeentity.h"\ + + +"$(INTDIR)\policeentity.obj" : $(SOURCE) $(DEP_CPP_POLICE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\policestate.cpp +DEP_CPP_POLICES=\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\policestate.h"\ + + +"$(INTDIR)\policestate.obj" : $(SOURCE) $(DEP_CPP_POLICES) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\racecar.cpp +DEP_CPP_RACEC=\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\racecar.h"\ + + +"$(INTDIR)\racecar.obj" : $(SOURCE) $(DEP_CPP_RACEC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\racestandsentity.cpp +DEP_CPP_RACES=\ + ".\LEGO1\buildingentity.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\racestandsentity.h"\ + + +"$(INTDIR)\racestandsentity.obj" : $(SOURCE) $(DEP_CPP_RACES) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\racestate.cpp +DEP_CPP_RACEST=\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\racestate.h"\ + + +"$(INTDIR)\racestate.obj" : $(SOURCE) $(DEP_CPP_RACEST) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\radio.cpp +DEP_CPP_RADIO=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\radio.h"\ + + +"$(INTDIR)\radio.obj" : $(SOURCE) $(DEP_CPP_RADIO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\radiostate.cpp +DEP_CPP_RADIOS=\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\radiostate.h"\ + + +"$(INTDIR)\radiostate.obj" : $(SOURCE) $(DEP_CPP_RADIOS) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\registrationbook.cpp +DEP_CPP_REGIS=\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\registrationbook.h"\ + + +"$(INTDIR)\registrationbook.obj" : $(SOURCE) $(DEP_CPP_REGIS) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\score.cpp +DEP_CPP_SCORE=\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\score.h"\ + + +"$(INTDIR)\score.obj" : $(SOURCE) $(DEP_CPP_SCORE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\skateboard.cpp +DEP_CPP_SKATE=\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\skateboard.h"\ + + +"$(INTDIR)\skateboard.obj" : $(SOURCE) $(DEP_CPP_SKATE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\towtrack.cpp +DEP_CPP_TOWTR=\ + ".\LEGO1\islepathactor.h"\ + ".\LEGO1\legoactor.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legopathactor.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\towtrack.h"\ + + +"$(INTDIR)\towtrack.obj" : $(SOURCE) $(DEP_CPP_TOWTR) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\towtrackmissionstate.cpp +DEP_CPP_TOWTRA=\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\towtrackmissionstate.h"\ + + +"$(INTDIR)\towtrackmissionstate.obj" : $(SOURCE) $(DEP_CPP_TOWTRA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxcompositemediapresenter.cpp +DEP_CPP_MXCOM=\ + ".\LEGO1\mxcompositemediapresenter.h"\ + ".\LEGO1\mxcompositepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxcompositemediapresenter.obj" : $(SOURCE) $(DEP_CPP_MXCOM)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxcompositepresenter.cpp +DEP_CPP_MXCOMP=\ + ".\LEGO1\mxcompositepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxcompositepresenter.obj" : $(SOURCE) $(DEP_CPP_MXCOMP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legostate.cpp +DEP_CPP_LEGOST=\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legostate.obj" : $(SOURCE) $(DEP_CPP_LEGOST) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxaudiopresenter.cpp +DEP_CPP_MXAUD=\ + ".\LEGO1\mxaudiopresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxaudiopresenter.obj" : $(SOURCE) $(DEP_CPP_MXAUD) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxsoundpresenter.cpp +DEP_CPP_MXSOUN=\ + ".\LEGO1\mxaudiopresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxsoundpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxsoundpresenter.obj" : $(SOURCE) $(DEP_CPP_MXSOUN) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxioinfo.cpp +DEP_CPP_MXIOI=\ + ".\LEGO1\mxioinfo.h"\ + + +"$(INTDIR)\mxioinfo.obj" : $(SOURCE) $(DEP_CPP_MXIOI) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + # End Source File ################################################################################ # Begin Source File @@ -938,6 +3340,804 @@ DEP_CPP_MXDSS=\ $(CPP) $(CPP_PROJ) $(SOURCE) +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\act3state.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_ACT3ST=\ + ".\LEGO1\act3state.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\act3state.obj" : $(SOURCE) $(DEP_CPP_ACT3ST) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_ACT3ST=\ + ".\LEGO1\act3state.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\act3state.obj" : $(SOURCE) $(DEP_CPP_ACT3ST) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\helicopterstate.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_HELICO=\ + ".\LEGO1\helicopterstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\helicopterstate.obj" : $(SOURCE) $(DEP_CPP_HELICO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_HELICO=\ + ".\LEGO1\helicopterstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\helicopterstate.obj" : $(SOURCE) $(DEP_CPP_HELICO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\jukeboxstate.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_JUKEBOX=\ + ".\LEGO1\jukeboxstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\jukeboxstate.obj" : $(SOURCE) $(DEP_CPP_JUKEBOX) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_JUKEBOX=\ + ".\LEGO1\jukeboxstate.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\jukeboxstate.obj" : $(SOURCE) $(DEP_CPP_JUKEBOX) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legoact2state.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_LEGOAC=\ + ".\LEGO1\legoact2state.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoact2state.obj" : $(SOURCE) $(DEP_CPP_LEGOAC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_LEGOAC=\ + ".\LEGO1\legoact2state.h"\ + ".\LEGO1\legostate.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legoact2state.obj" : $(SOURCE) $(DEP_CPP_LEGOAC) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legopathcontroller.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_LEGOPATH=\ + ".\LEGO1\legopathcontroller.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legopathcontroller.obj" : $(SOURCE) $(DEP_CPP_LEGOPATH) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_LEGOPATH=\ + ".\LEGO1\legopathcontroller.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\legopathcontroller.obj" : $(SOURCE) $(DEP_CPP_LEGOPATH) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\legovideomanager.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_LEGOV=\ + ".\LEGO1\lego3dmanager.h"\ + ".\LEGO1\lego3dview.h"\ + ".\LEGO1\legovideomanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpalette.h"\ + ".\LEGO1\mxrect32.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxunknown100dc6b0.h"\ + ".\LEGO1\mxvariabletable.h"\ + ".\LEGO1\mxvideomanager.h"\ + ".\LEGO1\mxvideoparam.h"\ + ".\LEGO1\mxvideoparamflags.h"\ + ".\LEGO1\viewmanager.h"\ + + +"$(INTDIR)\legovideomanager.obj" : $(SOURCE) $(DEP_CPP_LEGOV) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_LEGOV=\ + ".\LEGO1\lego3dmanager.h"\ + ".\LEGO1\lego3dview.h"\ + ".\LEGO1\legovideomanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxpalette.h"\ + ".\LEGO1\mxrect32.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxunknown100dc6b0.h"\ + ".\LEGO1\mxvariabletable.h"\ + ".\LEGO1\mxvideomanager.h"\ + ".\LEGO1\mxvideoparam.h"\ + ".\LEGO1\mxvideoparamflags.h"\ + ".\LEGO1\viewmanager.h"\ + + +"$(INTDIR)\legovideomanager.obj" : $(SOURCE) $(DEP_CPP_LEGOV) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxbackgroundaudiomanager.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXBAC=\ + ".\LEGO1\mxbackgroundaudiomanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxbackgroundaudiomanager.obj" : $(SOURCE) $(DEP_CPP_MXBAC)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXBAC=\ + ".\LEGO1\mxbackgroundaudiomanager.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxbackgroundaudiomanager.obj" : $(SOURCE) $(DEP_CPP_MXBAC)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdiskstreamprovider.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDISK=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdiskstreamprovider.h"\ + ".\LEGO1\mxstreamprovider.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdiskstreamprovider.obj" : $(SOURCE) $(DEP_CPP_MXDISK) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDISK=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdiskstreamprovider.h"\ + ".\LEGO1\mxstreamprovider.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdiskstreamprovider.obj" : $(SOURCE) $(DEP_CPP_MXDISK) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsaction.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSA=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsaction.obj" : $(SOURCE) $(DEP_CPP_MXDSA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSA=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsaction.obj" : $(SOURCE) $(DEP_CPP_MXDSA) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsanim.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSAN=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsanim.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsanim.obj" : $(SOURCE) $(DEP_CPP_MXDSAN) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSAN=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsanim.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsanim.obj" : $(SOURCE) $(DEP_CPP_MXDSAN) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsevent.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSE=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsevent.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsevent.obj" : $(SOURCE) $(DEP_CPP_MXDSE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSE=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsevent.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsevent.obj" : $(SOURCE) $(DEP_CPP_MXDSE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsmediaaction.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSM=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsmediaaction.obj" : $(SOURCE) $(DEP_CPP_MXDSM) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSM=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsmediaaction.obj" : $(SOURCE) $(DEP_CPP_MXDSM) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsmultiaction.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSMU=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsmultiaction.obj" : $(SOURCE) $(DEP_CPP_MXDSMU) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSMU=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsmultiaction.obj" : $(SOURCE) $(DEP_CPP_MXDSMU) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsobjectaction.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSOB=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsobjectaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsobjectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSOB) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSOB=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsobjectaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsobjectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSOB) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsparallelaction.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSP=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsparallelaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsparallelaction.obj" : $(SOURCE) $(DEP_CPP_MXDSP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSP=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsparallelaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsparallelaction.obj" : $(SOURCE) $(DEP_CPP_MXDSP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsselectaction.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSSE=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsparallelaction.h"\ + ".\LEGO1\mxdsselectaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsselectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSSE=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsparallelaction.h"\ + ".\LEGO1\mxdsselectaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsselectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsserialaction.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSSER=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsserialaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsserialaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSER) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSSER=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmultiaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsserialaction.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsserialaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSER) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdssound.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSSO=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdssound.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdssound.obj" : $(SOURCE) $(DEP_CPP_MXDSSO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSSO=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdssound.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdssound.obj" : $(SOURCE) $(DEP_CPP_MXDSSO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdsstill.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSST=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsstill.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsstill.obj" : $(SOURCE) $(DEP_CPP_MXDSST) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSST=\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsmediaaction.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdsstill.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdsstill.obj" : $(SOURCE) $(DEP_CPP_MXDSST) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxdssubscriber.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXDSSU=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdssubscriber.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdssubscriber.obj" : $(SOURCE) $(DEP_CPP_MXDSSU) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXDSSU=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxdssubscriber.h"\ + ".\LEGO1\mxtypes.h"\ + + +"$(INTDIR)\mxdssubscriber.obj" : $(SOURCE) $(DEP_CPP_MXDSSU) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\LEGO1\mxloopingflcpresenter.cpp + +!IF "$(CFG)" == "LEGO1 - Win32 Release" + +DEP_CPP_MXLOOP=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxflcpresenter.h"\ + ".\LEGO1\mxloopingflcpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxloopingflcpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOOP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" + +DEP_CPP_MXLOOP=\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxflcpresenter.h"\ + ".\LEGO1\mxloopingflcpresenter.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxvideopresenter.h"\ + + +"$(INTDIR)\mxloopingflcpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOOP) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + # End Source File # End Target ################################################################################ @@ -955,63 +4155,12 @@ DEP_CPP_MXDSS=\ ################################################################################ # Begin Source File -SOURCE=.\ISLE\isle.cpp -DEP_CPP_ISLE_=\ +SOURCE=.\ISLE\define.cpp +DEP_CPP_DEFIN=\ ".\ISLE\define.h"\ - ".\ISLE\isle.h"\ - ".\ISLE\res\resource.h"\ - ".\LEGO1\lego3dmanager.h"\ - ".\LEGO1\lego3dview.h"\ - ".\LEGO1\legoanimationmanager.h"\ - ".\LEGO1\legobuildingmanager.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legogamestate.h"\ - ".\LEGO1\legoinputmanager.h"\ - ".\LEGO1\legomodelpresenter.h"\ - ".\LEGO1\legonavcontroller.h"\ - ".\LEGO1\legoomni.h"\ - ".\LEGO1\legopartpresenter.h"\ - ".\LEGO1\legoroi.h"\ - ".\LEGO1\legovideomanager.h"\ - ".\LEGO1\legoworldpresenter.h"\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxbackgroundaudiomanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxdirectdraw.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsfile.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdssource.h"\ - ".\LEGO1\mxeventmanager.h"\ - ".\LEGO1\mxioinfo.h"\ - ".\LEGO1\mxmusicmanager.h"\ - ".\LEGO1\mxnotificationmanager.h"\ - ".\LEGO1\mxobjectfactory.h"\ - ".\LEGO1\mxomni.h"\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxomnicreateparam.h"\ - ".\LEGO1\mxomnicreateparambase.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxresult.h"\ - ".\LEGO1\mxsoundmanager.h"\ - ".\LEGO1\mxstreamcontroller.h"\ - ".\LEGO1\mxstreamer.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxticklemanager.h"\ - ".\LEGO1\mxtimer.h"\ - ".\LEGO1\mxtransitionmanager.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - ".\LEGO1\viewmanager.h"\ -"$(INTDIR)\isle.obj" : $(SOURCE) $(DEP_CPP_ISLE_) "$(INTDIR)" +"$(INTDIR)\define.obj" : $(SOURCE) $(DEP_CPP_DEFIN) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) @@ -1164,6 +4313,18 @@ SOURCE=.\LEGO1\legoworldpresenter.h ################################################################################ # Begin Source File +SOURCE=.\LEGO1\mxatomid.h + +!IF "$(CFG)" == "ISLE - Win32 Release" + +!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + SOURCE=.\LEGO1\mxbackgroundaudiomanager.h !IF "$(CFG)" == "ISLE - Win32 Release" @@ -1446,24 +4607,71 @@ SOURCE=.\LEGO1\mxvideoparamflags.h ################################################################################ # Begin Source File -SOURCE=.\LEGO1\mxatomid.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\ISLE\define.cpp -DEP_CPP_DEFIN=\ +SOURCE=.\ISLE\isleapp.cpp +DEP_CPP_ISLEAP=\ ".\ISLE\define.h"\ + ".\ISLE\isleapp.h"\ + ".\ISLE\res\resource.h"\ + ".\LEGO1\isle.h"\ + ".\LEGO1\lego3dmanager.h"\ + ".\LEGO1\lego3dview.h"\ + ".\LEGO1\legoanimationmanager.h"\ + ".\LEGO1\legobuildingmanager.h"\ + ".\LEGO1\legoentity.h"\ + ".\LEGO1\legoentitypresenter.h"\ + ".\LEGO1\legogamestate.h"\ + ".\LEGO1\legoinputmanager.h"\ + ".\LEGO1\legomodelpresenter.h"\ + ".\LEGO1\legonavcontroller.h"\ + ".\LEGO1\legoomni.h"\ + ".\LEGO1\legopartpresenter.h"\ + ".\LEGO1\legoplantmanager.h"\ + ".\LEGO1\legoroi.h"\ + ".\LEGO1\legovideomanager.h"\ + ".\LEGO1\legoworld.h"\ + ".\LEGO1\legoworldpresenter.h"\ + ".\LEGO1\mxatomid.h"\ + ".\LEGO1\mxbackgroundaudiomanager.h"\ + ".\LEGO1\mxcompositepresenter.h"\ + ".\LEGO1\mxcore.h"\ + ".\LEGO1\mxcriticalsection.h"\ + ".\LEGO1\mxdirectdraw.h"\ + ".\LEGO1\mxdsaction.h"\ + ".\LEGO1\mxdsfile.h"\ + ".\LEGO1\mxdsobject.h"\ + ".\LEGO1\mxdssource.h"\ + ".\LEGO1\mxentity.h"\ + ".\LEGO1\mxeventmanager.h"\ + ".\LEGO1\mxioinfo.h"\ + ".\LEGO1\mxmediapresenter.h"\ + ".\LEGO1\mxmusicmanager.h"\ + ".\LEGO1\mxnotificationmanager.h"\ + ".\LEGO1\mxobjectfactory.h"\ + ".\LEGO1\mxomni.h"\ + ".\LEGO1\mxomnicreateflags.h"\ + ".\LEGO1\mxomnicreateparam.h"\ + ".\LEGO1\mxomnicreateparambase.h"\ + ".\LEGO1\mxpalette.h"\ + ".\LEGO1\mxpresenter.h"\ + ".\LEGO1\mxrect32.h"\ + ".\LEGO1\mxsoundmanager.h"\ + ".\LEGO1\mxstreamcontroller.h"\ + ".\LEGO1\mxstreamer.h"\ + ".\LEGO1\mxstring.h"\ + ".\LEGO1\mxticklemanager.h"\ + ".\LEGO1\mxtimer.h"\ + ".\LEGO1\mxtransitionmanager.h"\ + ".\LEGO1\mxtypes.h"\ + ".\LEGO1\mxunknown100dc6b0.h"\ + ".\LEGO1\mxvariabletable.h"\ + ".\LEGO1\mxvideomanager.h"\ + ".\LEGO1\mxvideoparam.h"\ + ".\LEGO1\mxvideoparamflags.h"\ + ".\LEGO1\mxvideopresenter.h"\ + ".\LEGO1\viewmanager.h"\ -"$(INTDIR)\define.obj" : $(SOURCE) $(DEP_CPP_DEFIN) "$(INTDIR)" +"$(INTDIR)\isleapp.obj" : $(SOURCE) $(DEP_CPP_ISLEAP) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) diff --git a/isle.mdp b/isle.mdp index 56789362a8e8383ca4db0ab95d5f19ac0cc4e1d1..a5fc4336c047d2ec813b3d9e4b9a8ed8026f48de 100644 GIT binary patch literal 78336 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 diff --git a/tools/reccmp/reccmp.py b/tools/reccmp/reccmp.py index a8d3cd07..3b783fc9 100755 --- a/tools/reccmp/reccmp.py +++ b/tools/reccmp/reccmp.py @@ -292,7 +292,7 @@ def parse_asm(file, addr, size): line = line.strip() - if line.startswith(pattern): + if line.startswith(pattern) and not line.endswith("STUB"): par = line[len(pattern):].strip().split() module = par[0] if module != basename: From 3e58002ba596fb4f8aa0bf08a01dc0985b92feb0 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 29 Jun 2023 17:48:42 +0200 Subject: [PATCH 08/34] MxStreamController: fix structure (#57) --- LEGO1/mxstreamcontroller.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h index 8884b49f..4ec95e9e 100644 --- a/LEGO1/mxstreamcontroller.h +++ b/LEGO1/mxstreamcontroller.h @@ -8,7 +8,6 @@ class MxStreamController : public MxCore { public: - // OFFSET: LEGO1 0x100c0f10 inline virtual const char *ClassName() const override // vtable+0xc { @@ -22,8 +21,6 @@ class MxStreamController : public MxCore return !strcmp(name, MxStreamController::ClassName()) || MxCore::IsA(name); } - int m_unk00; - int m_unk04; int m_unk08; int m_unk0c; int m_unk10; From 566e107290e208ba0380d84e387c2b3fafc08a09 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Jun 2023 09:02:52 -0700 Subject: [PATCH 09/34] reccmp: only show recompiled address on request Improves comparisons between diffs because the addresses shifting around leads to false positives --- tools/reccmp/reccmp.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/reccmp/reccmp.py b/tools/reccmp/reccmp.py index 3b783fc9..abfe71a7 100755 --- a/tools/reccmp/reccmp.py +++ b/tools/reccmp/reccmp.py @@ -16,12 +16,13 @@ parser.add_argument('recompiled', metavar='recompiled-binary', help='The recompiled binary') parser.add_argument('pdb', metavar='recompiled-pdb', help='The PDB of the recompiled binary') parser.add_argument('decomp_dir', metavar='decomp-dir', help='The decompiled source tree') -parser.add_argument('--total', '-T', metavar='total-func-count', help='Total number of expected functions (improves total accuracy statistic)') -parser.add_argument('--verbose', '-v', metavar='offset', help='Print assembly diff for specific function (original file\'s offset)') -parser.add_argument('--html', '-H', metavar='output-file', help='Generate searchable HTML summary of status and diffs') +parser.add_argument('--total', '-T', metavar='', help='Total number of expected functions (improves total accuracy statistic)') +parser.add_argument('--verbose', '-v', metavar='', help='Print assembly diff for specific function (original file\'s offset)') +parser.add_argument('--html', '-H', metavar='', help='Generate searchable HTML summary of status and diffs') parser.add_argument('--no-color', '-n', action='store_true', help='Do not color the output') -parser.add_argument('--svg', '-S', metavar='output-svg', help='Generate SVG graphic of progress') -parser.add_argument('--svg-icon', metavar='svg-icon', help='Icon to use in SVG (PNG)') +parser.add_argument('--svg', '-S', metavar='', help='Generate SVG graphic of progress') +parser.add_argument('--svg-icon', metavar='icon', help='Icon to use in SVG (PNG)') +parser.add_argument('--print-rec-addr', action='store_true', help='Print addresses of recompiled functions too') args = parser.parse_args() @@ -335,7 +336,11 @@ def parse_asm(file, addr, size): percenttext = colorama.Fore.RED + percenttext + colorama.Style.RESET_ALL if not verbose: - print(' %s (%s / %s) is %s similar to the original' % (recinfo.name, hex(addr), hex(recinfo.addr), percenttext)) + if args.print_rec_addr: + addrs = '%s / %s' % (hex(addr), hex(recinfo.addr)) + else: + addrs = hex(addr) + print(' %s (%s) is %s similar to the original' % (recinfo.name, addrs, percenttext)) function_count += 1 total_accuracy += ratio From 6761345c8cc61675222bf0138d633552d0d4e3ac Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 29 Jun 2023 18:05:45 +0200 Subject: [PATCH 10/34] lego1: fix/match some ClassName functions (#60) --- LEGO1/legoanimationmanager.h | 2 +- LEGO1/legocameracontroller.h | 2 +- LEGO1/legohideanimpresenter.h | 2 +- LEGO1/legolocomotionanimpresenter.h | 2 +- LEGO1/legoloopinganimpresenter.h | 2 +- LEGO1/legonavcontroller.h | 2 +- LEGO1/legopalettepresenter.h | 2 +- LEGO1/mxstreamprovider.h | 11 +++++++++++ 8 files changed, 18 insertions(+), 7 deletions(-) diff --git a/LEGO1/legoanimationmanager.h b/LEGO1/legoanimationmanager.h index 5fae368e..c42b7715 100644 --- a/LEGO1/legoanimationmanager.h +++ b/LEGO1/legoanimationmanager.h @@ -24,7 +24,7 @@ class LegoAnimationManager : public MxCore // OFFSET: LEGO1 0x1005ec90 inline virtual MxBool IsA(const char *name) const override // vtable+0x10 { - return !strcmp(name, LegoAnimationManager::ClassName()) || MxCore::IsA(name); + return !strcmp(name, ClassName()) || MxCore::IsA(name); } __declspec(dllexport) static void configureLegoAnimationManager(int param_1); diff --git a/LEGO1/legocameracontroller.h b/LEGO1/legocameracontroller.h index af5015ae..15afff7f 100644 --- a/LEGO1/legocameracontroller.h +++ b/LEGO1/legocameracontroller.h @@ -21,7 +21,7 @@ class LegoCameraController : public MxCore // OFFSET: LEGO1 0x10011ed0 inline virtual MxBool IsA(const char *name) const override // vtable+0x10 { - return !strcmp(name, LegoCameraController::ClassName()) || MxCore::IsA(name); + return !strcmp(name, ClassName()) || MxCore::IsA(name); } }; diff --git a/LEGO1/legohideanimpresenter.h b/LEGO1/legohideanimpresenter.h index 0c078e9b..abc63d78 100644 --- a/LEGO1/legohideanimpresenter.h +++ b/LEGO1/legohideanimpresenter.h @@ -20,7 +20,7 @@ class LegoHideAnimPresenter : public LegoLoopingAnimPresenter // OFFSET: LEGO1 0x1006d890 inline MxBool IsA(const char *name) const override // vtable+0x10 { - return !strcmp(name, LegoHideAnimPresenter::ClassName()) || LegoAnimPresenter::IsA(name); + return !strcmp(name, ClassName()) || LegoAnimPresenter::IsA(name); } private: diff --git a/LEGO1/legolocomotionanimpresenter.h b/LEGO1/legolocomotionanimpresenter.h index b5906ca6..89a3039c 100644 --- a/LEGO1/legolocomotionanimpresenter.h +++ b/LEGO1/legolocomotionanimpresenter.h @@ -19,7 +19,7 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter // OFFSET: LEGO1 0x1006ce60 inline MxBool IsA(const char *name) const override // vtable+0x10 { - return !strcmp(name, LegoLocomotionAnimPresenter::ClassName()) || LegoLoopingAnimPresenter::IsA(name); + return !strcmp(name, ClassName()) || LegoLoopingAnimPresenter::IsA(name); } private: diff --git a/LEGO1/legoloopinganimpresenter.h b/LEGO1/legoloopinganimpresenter.h index 6e4a5eb1..672ff260 100644 --- a/LEGO1/legoloopinganimpresenter.h +++ b/LEGO1/legoloopinganimpresenter.h @@ -18,7 +18,7 @@ class LegoLoopingAnimPresenter : public LegoAnimPresenter // OFFSET: LEGO1 0x1000c9b0 inline MxBool IsA(const char *name) const override // vtable+0x10 { - return !strcmp(name, LegoLoopingAnimPresenter::ClassName()) || LegoAnimPresenter::IsA(name); + return !strcmp(name, ClassName()) || LegoAnimPresenter::IsA(name); } }; diff --git a/LEGO1/legonavcontroller.h b/LEGO1/legonavcontroller.h index d2bf7df7..9bffd7dd 100644 --- a/LEGO1/legonavcontroller.h +++ b/LEGO1/legonavcontroller.h @@ -32,7 +32,7 @@ class LegoNavController : public MxCore // OFFSET: LEGO1 0x10054b90 inline MxBool IsA(const char *name) const override // vtable+0x10 { - return !strcmp(name, LegoNavController::ClassName()) || MxCore::IsA(name); + return !strcmp(name, ClassName()) || MxCore::IsA(name); } void SetControlMax(int p_hMax, int p_vMax); diff --git a/LEGO1/legopalettepresenter.h b/LEGO1/legopalettepresenter.h index bb1b116e..d5fbefba 100644 --- a/LEGO1/legopalettepresenter.h +++ b/LEGO1/legopalettepresenter.h @@ -21,7 +21,7 @@ class LegoPalettePresenter : public MxVideoPresenter // OFFSET: LEGO1 0x10079f40 inline MxBool IsA(const char *name) const override // vtable+0x10 { - return !strcmp(name, LegoPalettePresenter::ClassName()) || MxVideoPresenter::IsA(name); + return !strcmp(name, ClassName()) || MxVideoPresenter::IsA(name); } private: diff --git a/LEGO1/mxstreamprovider.h b/LEGO1/mxstreamprovider.h index fda71bb1..796d0ed3 100644 --- a/LEGO1/mxstreamprovider.h +++ b/LEGO1/mxstreamprovider.h @@ -6,7 +6,18 @@ // VTABLE 0x100dd100 class MxStreamProvider : public MxCore { +public: + // OFFSET: LEGO1 0x100d07e0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + return "MxStreamProvider"; + } + // OFFSET: LEGO1 0x100d07f0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxStreamProvider::ClassName()) || MxCore::IsA(name); + } }; #endif // MXSTREAMPROVIDER_H From 6558a78848c5e8dfcab62955f80894dde3bf7a2b Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 29 Jun 2023 18:08:06 +0200 Subject: [PATCH 11/34] lego1: implement MxDSObject (#55) * Implement MxDSObject * use discovered names * Update LEGO1/mxdsobject.cpp Co-authored-by: Anonymous Maarten * Update mxdsobject.cpp * Update mxdsobject.h --------- Co-authored-by: Anonymous Maarten --- LEGO1/mxdsobject.cpp | 105 ++++++++++++++++++++++++++++++++++++++----- LEGO1/mxdsobject.h | 30 +++++++------ 2 files changed, 111 insertions(+), 24 deletions(-) diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index 11b912a0..fd4b7434 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -7,9 +7,9 @@ MxDSObject::MxDSObject() { this->m_unk0c = 0; - this->m_unk10 = 0; + this->m_sourceName = NULL; this->m_unk14 = 0; - this->m_name = NULL; + this->m_objectName = NULL; this->m_unk24 = -1; this->m_unk1c = -1; this->m_unk28 = 0; @@ -18,25 +18,110 @@ MxDSObject::MxDSObject() // OFFSET: LEGO1 0x100bf7e0 MxDSObject::~MxDSObject() { - // TODO + delete[] m_objectName; + delete[] m_sourceName; +} + +// OFFSET: LEGO1 0x100bf870 +void MxDSObject::CopyFrom(MxDSObject &p_dsObject) +{ + this->SetSourceName(p_dsObject.m_sourceName); + this->m_unk14 = p_dsObject.m_unk14; + this->SetObjectName(p_dsObject.m_objectName); + this->m_unk1c = p_dsObject.m_unk1c; + this->m_unk24 = p_dsObject.m_unk24; + this->m_atomId = p_dsObject.m_atomId; + this->m_unk28 = p_dsObject.m_unk28; +} + +// OFFSET: LEGO1 0x100bf8c0 +MxDSObject &MxDSObject::operator=(MxDSObject &p_dsObject) +{ + if (this == &p_dsObject) + return *this; + + this->CopyFrom(p_dsObject); + return *this; } // OFFSET: LEGO1 0x100bf8e0 void MxDSObject::SetObjectName(const char *p_name) { - if (p_name != this->m_name) - { - free(this->m_name); + if (p_name != this->m_objectName) { + delete[] this->m_objectName; if (p_name) { - this->m_name = (char *)malloc(strlen(p_name) + 1); + this->m_objectName = new char[strlen(p_name) + 1]; - if (this->m_name) { - strcpy(this->m_name, p_name); + if (this->m_objectName) { + strcpy(this->m_objectName, p_name); } } else { - this->m_name = NULL; + this->m_objectName = NULL; } } } + +// OFFSET: LEGO1 0x100bf950 +void MxDSObject::SetSourceName(const char *p_sourceName) +{ + if (p_sourceName != this->m_sourceName) { + delete[] this->m_sourceName; + + if (p_sourceName) { + this->m_sourceName = new char[strlen(p_sourceName) + 1]; + + if (this->m_sourceName) { + strcpy(this->m_sourceName, p_sourceName); + } + } + else { + this->m_sourceName = NULL; + } + } +} + +// OFFSET: LEGO1 0x100bf9c0 +int MxDSObject::unk14() +{ + return 10; +} + +// OFFSET: LEGO1 0x100bf9d0 +unsigned int MxDSObject::CalculateUnk08() +{ + unsigned int unk08; + + if (this->m_sourceName) + unk08 = strlen(this->m_sourceName) + 3; + else + unk08 = 3; + + unk08 += 4; + + if (this->m_objectName) + unk08 += strlen(this->m_objectName) + 1; + else + unk08++; + + unk08 += 4; + this->m_unk08 = unk08; + return unk08; +} + +// OFFSET: LEGO1 0x100bfa20 +void MxDSObject::Parse(char **p_source, unsigned short p_unk24) +{ + this->SetSourceName(*p_source); + *p_source += strlen(this->m_sourceName) + 1; + this->m_unk14 = *(int*) *p_source; + *p_source += 4; + + this->SetObjectName(*p_source); + *p_source += strlen(this->m_objectName) + 1; + this->m_unk1c = *(int*) *p_source; + *p_source += 4; + + this->m_unk24 = p_unk24; +} diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index 4f0aced6..ef4701bc 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -9,23 +9,25 @@ class MxDSObject : public MxCore { public: - __declspec(dllexport) void SetObjectName(const char *); + __declspec(dllexport) void SetObjectName(const char *p_objectName); MxDSObject(); virtual ~MxDSObject() override; - // OFFSET: LEGO1 0x100bf730 - inline virtual const char *ClassName() const override // vtable+0x0c - { - // 0x10101400 - return "MxDSObject"; - } + MxDSObject &operator=(MxDSObject &p_dsObject); + void CopyFrom(MxDSObject &p_dsObject); + + // OFFSET: LEGO1 0x100bf730 + inline virtual const char *ClassName() const override { return "MxDSObject"; }; // vtable+0c // OFFSET: LEGO1 0x100bf740 - inline virtual MxBool IsA(const char *name) const override // vtable+0x10 - { - return !strcmp(name, MxDSObject::ClassName()) || MxCore::IsA(name); - } + inline virtual MxBool IsA(const char *name) const override { return !strcmp(name, MxDSObject::ClassName()) || MxCore::IsA(name); }; // vtable+10; + + virtual int unk14(); // vtable+14; + virtual unsigned int CalculateUnk08(); // vtable+18; + virtual void Parse(char **p_source, unsigned short p_unk24); // vtable+1c; + + void SetSourceName(const char *p_sourceName); inline const MxAtomId& GetAtomId() { return this->m_atomId; } inline int GetUnknown1c() { return this->m_unk1c; } @@ -38,11 +40,11 @@ class MxDSObject : public MxCore inline void SetAtomId(MxAtomId p_atomId) { this->m_atomId = p_atomId; } private: - int m_unk08; + unsigned int m_unk08; short m_unk0c; - char* m_unk10; + char* m_sourceName; int m_unk14; - char *m_name; + char *m_objectName; int m_unk1c; MxAtomId m_atomId; short m_unk24; From 88c18c76ed18a25a974430f95edf10842dce3790 Mon Sep 17 00:00:00 2001 From: MishaProductions <106913236+MishaProductions@users.noreply.github.com> Date: Thu, 29 Jun 2023 20:02:47 +0300 Subject: [PATCH 12/34] lego1: match LegoOmni::GetInstance and deconstructor and add a few methods (#58) * add GetInstance fix * Implement a few methods * Move get* helpers to their correct locations * rename m_instance * add TransitionManager --- LEGO1/legoomni.cpp | 19 ++++++++++-- LEGO1/legoomni.h | 10 ++----- LEGO1/mxomni.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++-- LEGO1/mxomni.h | 21 ++++++++++--- 4 files changed, 107 insertions(+), 17 deletions(-) diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 0d1abaf1..13b67a2c 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -15,13 +15,20 @@ LegoOmni::~LegoOmni() // OFFSET: LEGO1 0x1005ad10 LegoOmni *LegoOmni::GetInstance() { - return (LegoOmni *) m_instance; + return (LegoOmni *)MxOmni::GetInstance(); +} + +// OFFSET: LEGO1 0x1005ac90 +void LegoOmni::CreateInstance() +{ + MxOmni::DestroyInstance(); + MxOmni::SetInstance(new LegoOmni()); } // OFFSET: LEGO1 0x10015700 LegoOmni *Lego() { - return (LegoOmni *) MxOmni::GetInstance(); + return (LegoOmni *)MxOmni::GetInstance(); } // OFFSET: LEGO1 0x10015710 @@ -30,7 +37,6 @@ LegoSoundManager *SoundManager() return LegoOmni::GetInstance()->GetSoundManager(); } - // OFFSET: LEGO1 0x10015720 LegoVideoManager *VideoManager() { @@ -79,6 +85,13 @@ LegoNavController *NavController() return LegoOmni::GetInstance()->GetNavController(); } +// OFFSET: LEGO1 0x10015900 +MxTransitionManager *TransitionManager() +{ + return LegoOmni::GetInstance()->GetTransitionManager(); +} + + // OFFSET: LEGO1 0x1005b5f0 long LegoOmni::Notify(MxParam &p) { diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 40804cbf..05c1bfd0 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -71,6 +71,7 @@ class LegoOmni : public MxOmni LegoPlantManager *GetLegoPlantManager() { return m_plantManager; } LegoGameState *GetGameState() { return m_gameState; } LegoNavController *GetNavController() { return m_navController; } + MxTransitionManager *GetTransitionManager() { return m_transitionManager; } private: int m_unk68; @@ -84,7 +85,7 @@ class LegoOmni : public MxOmni char m_unk94[0x4]; LegoBuildingManager* m_buildingManager; // 0x98 LegoGameState *m_gameState; // 0x9c - char m_unka0[0x94]; + MxDSAction m_action; MxBackgroundAudioManager *m_bkgAudioManager; // 0x134 MxTransitionManager *m_transitionManager; // 0x138 int m_unk13c; @@ -93,26 +94,19 @@ class LegoOmni : public MxOmni __declspec(dllexport) MxBackgroundAudioManager * BackgroundAudioManager(); __declspec(dllexport) MxDSObject * CreateStreamObject(MxDSFile *,short); -__declspec(dllexport) MxEventManager * EventManager(); __declspec(dllexport) LegoGameState * GameState(); __declspec(dllexport) const char * GetNoCD_SourceName(); __declspec(dllexport) LegoInputManager * InputManager(); __declspec(dllexport) LegoOmni * Lego(); -__declspec(dllexport) MxSoundManager * MSoundManager(); __declspec(dllexport) void MakeSourceName(char *, const char *); -__declspec(dllexport) MxMusicManager * MusicManager(); __declspec(dllexport) MxNotificationManager * NotificationManager(); __declspec(dllexport) LegoEntity * PickEntity(long,long); __declspec(dllexport) LegoROI * PickROI(long,long); __declspec(dllexport) void SetOmniUserMessage(void (*)(const char *,int)); __declspec(dllexport) LegoSoundManager * SoundManager(); __declspec(dllexport) long Start(MxDSAction *); -__declspec(dllexport) MxStreamer * Streamer(); -__declspec(dllexport) MxTickleManager * TickleManager(); __declspec(dllexport) MxTransitionManager * TransitionManager(); -__declspec(dllexport) MxVariableTable * VariableTable(); __declspec(dllexport) LegoVideoManager * VideoManager(); - __declspec(dllexport) long Start(MxDSAction *a); LegoBuildingManager* BuildingManager(); diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index 9752f6ea..9598141d 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -1,7 +1,7 @@ #include "mxomni.h" // 0x101015b0 -MxOmni* MxOmni::m_instance = NULL; +MxOmni *MxOmni::g_instance = NULL; // OFFSET: LEGO1 0x100aef10 MxOmni::MxOmni() @@ -33,10 +33,26 @@ void MxOmni::Init() m_unk64 = NULL; } +// OFFSET: LEGO1 0x100b0690 +void MxOmni::DestroyInstance() +{ + if (g_instance != NULL) + { + delete g_instance; + g_instance = NULL; + } +} + // OFFSET: LEGO1 0x100b0680 MxOmni *MxOmni::GetInstance() { - return m_instance; + return g_instance; +} + +// OFFSET: LEGO1 0x100af0b0 +void MxOmni::SetInstance(MxOmni *instance) +{ + g_instance = instance; } // OFFSET: LEGO1 0x100af0c0 @@ -67,8 +83,62 @@ long MxOmni::Notify(MxParam &p) return 0; } +// OFFSET: LEGO1 0x100acea0 +MxObjectFactory *ObjectFactory() +{ + return MxOmni::GetInstance()->GetObjectFactory(); +} + +// OFFSET: LEGO1 0x100aceb0 +MxNotificationManager *NotificationManager() +{ + return MxOmni::GetInstance()->GetNotificationManager(); +} + +// OFFSET: LEGO1 0x100acec0 +MxTickleManager *TickleManager() +{ + return MxOmni::GetInstance()->GetTickleManager(); +} + // OFFSET: LEGO1 0x100aced0 MxTimer *Timer() { return MxOmni::GetInstance()->GetTimer(); } + +// OFFSET: LEGO1 0x100acef0 +MxStreamer* Streamer() +{ + return MxOmni::GetInstance()->GetStreamer(); +} + +// OFFSET: LEGO1 0x100acf00 +MxSoundManager* MSoundManager() +{ + return MxOmni::GetInstance()->GetSoundManager(); +} + +// OFFSET: LEGO1 0x100acf10 +MxVideoManager* MVideoManager() +{ + return MxOmni::GetInstance()->GetVideoManager(); +} + +// OFFSET: LEGO1 0x100acf20 +MxVariableTable* VariableTable() +{ + return MxOmni::GetInstance()->GetVariableTable(); +} + +// OFFSET: LEGO1 0x100acf30 +MxMusicManager* MusicManager() +{ + return MxOmni::GetInstance()->GetMusicManager(); +} + +// OFFSET: LEGO1 0x100acf40 +MxEventManager* EventManager() +{ + return MxOmni::GetInstance()->GetEventManager(); +} \ No newline at end of file diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index e9f61b7a..6a0d3ef8 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -35,11 +35,19 @@ class MxOmni : public MxCore virtual void Init(); // vtable+14 virtual MxResult Create(MxOmniCreateParam &p); // vtable+18 virtual void Destroy(); // vtable+1c - + static void SetInstance(MxOmni* instance); + MxObjectFactory* GetObjectFactory() const { return this->m_objectFactory; } + MxNotificationManager* GetNotificationManager() const { return this->m_notificationManager; } + MxTickleManager* GetTickleManager() const { return this->m_tickleManager; } MxTimer* GetTimer() const { return this->m_timer; } - + MxStreamer* GetStreamer() const { return this->m_streamer; } + MxSoundManager* GetSoundManager() const { return this->m_soundManager; } + MxVideoManager* GetVideoManager() const { return this->m_videoManager; } + MxVariableTable* GetVariableTable() const { return this->m_variableTable; } + MxMusicManager* GetMusicManager() const { return this->m_musicManager; } + MxEventManager* GetEventManager() const { return this->m_eventManager; } protected: - static MxOmni* m_instance; + static MxOmni* g_instance; MxString m_mediaPath; // 0x8 HWND *m_windowHandle; // 0x18; @@ -60,7 +68,12 @@ class MxOmni : public MxCore unsigned char m_unk64; // 0x64 }; - +__declspec(dllexport) MxTickleManager * TickleManager(); __declspec(dllexport) MxTimer * Timer(); +__declspec(dllexport) MxStreamer * Streamer(); +__declspec(dllexport) MxSoundManager * MSoundManager(); +__declspec(dllexport) MxVariableTable * VariableTable(); +__declspec(dllexport) MxMusicManager * MusicManager(); +__declspec(dllexport) MxEventManager * EventManager(); #endif // MXOMNI_H From aa3dfe1808b684e76fc235cb77dbd79420496673 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Thu, 29 Jun 2023 10:24:58 -0700 Subject: [PATCH 13/34] ci: skip continuous release on pull requests [skip ci] --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 54722601..39564bda 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -87,6 +87,7 @@ jobs: - name: Upload Continuous Release shell: bash + if: github.event_name == 'push' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | From 8476bf06b2319985307fa1093a8a64dba21326f8 Mon Sep 17 00:00:00 2001 From: MattKC <34096995+itsmattkc@users.noreply.github.com> Date: Thu, 29 Jun 2023 16:39:02 -0700 Subject: [PATCH 14/34] Yet another CMake implementation (#61) * initial cmake implementation * ci: i guess older cmake doesn't support this * cmake: add max version to suppress warning Co-authored-by: Anonymous Maarten --------- Co-authored-by: Anonymous Maarten --- .github/workflows/build.yml | 75 +- .gitignore | 1 + CMakeLists.txt | 212 ++ ISLE/res/isle.rc | 8 +- isle.mak | 4681 ----------------------------------- isle.mdp | Bin 78336 -> 0 bytes 6 files changed, 266 insertions(+), 4711 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 isle.mak delete mode 100644 isle.mdp diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39564bda..3e2b0d64 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: key: dx5sdk - name: Download DX5 SDK - if: steps.cache-dx5.outputs.cache-hit != 'true' + if: ${{ !steps.cache-dx5.outputs.cache-hit }} run: | cd dx5sdk curl -fLOSs https://archive.org/download/idx5sdk/idx5sdk.exe @@ -34,8 +34,7 @@ jobs: 7z x .\DX5SDK.EXE - name: Cache DX5 SDK - if: steps.cache-dx5.outputs.cache-hit != 'true' - id: save-dx5 + if: ${{ !steps.cache-dx5.outputs.cache-hit }} uses: actions/cache/save@v3 with: path: dx5sdk @@ -47,22 +46,47 @@ jobs: cd cdrom .\SETUP.EXE /s + - name: Setup cmake + uses: jwlawson/actions-setup-cmake@v1.13 + with: + # Use 2.8 for maximum backwards compatibility + cmake-version: '2.8.x' + - name: Build shell: cmd run: | call .\msvc420\bin\VCVARS32.BAT x86 - mkdir Release - .\msvc420\bin\NMAKE.EXE /f isle.mak CFG="ISLE - Win32 Release" + mkdir build + cd build + cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -G "NMake Makefiles" + cmake --build . + + - name: Restore cached original binaries + id: cache-original-binaries + uses: actions/cache/restore@v3 + with: + path: legobin + key: legobin + + - name: Download original island binares + if: ${{ !steps.cache-original-binaries.outputs.cache-hit }} + run: | + C:\msys64\usr\bin\wget.exe https://legoisland.org/download/ISLE.EXE --directory-prefix=legobin + C:\msys64\usr\bin\wget.exe https://legoisland.org/download/LEGO1.DLL --directory-prefix=legobin + + - name: Cache original binaries + if: ${{ !steps.cache-original-binaries.outputs.cache-hit }} + uses: actions/cache/save@v3 + with: + path: legobin + key: legobin - name: Summarize Accuracy shell: bash run: | - curl -fLOSs https://legoisland.org/download/ISLE.EXE - curl -fLOSs https://legoisland.org/download/LEGO1.DLL - pip install capstone - pip install colorama - python3 tools/reccmp/reccmp.py -S ISLEPROGRESS.SVG --svg-icon tools/reccmp/isle.png -H ISLEPROGRESS.HTML ISLE.EXE Release/ISLE.EXE Release/ISLE.PDB . | tee ISLEPROGRESS.TXT - python3 tools/reccmp/reccmp.py -S LEGO1PROGRESS.SVG -T 1929 --svg-icon tools/reccmp/lego1.png -H LEGO1PROGRESS.HTML LEGO1.DLL Release/LEGO1.DLL Release/LEGO1.PDB . | tee LEGO1PROGRESS.TXT + pip install -r tools/reccmp/requirements.txt + python3 tools/reccmp/reccmp.py -S ISLEPROGRESS.SVG --svg-icon tools/reccmp/isle.png -H ISLEPROGRESS.HTML legobin/ISLE.EXE build/ISLE.EXE build/ISLE.PDB . | tee ISLEPROGRESS.TXT + python3 tools/reccmp/reccmp.py -S LEGO1PROGRESS.SVG -T 1929 --svg-icon tools/reccmp/lego1.png -H LEGO1PROGRESS.HTML legobin/LEGO1.DLL build/LEGO1.DLL build/LEGO1.PDB . | tee LEGO1PROGRESS.TXT - name: Compare Accuracy With Current Master shell: bash @@ -79,11 +103,16 @@ jobs: with: name: Win32 path: | - Release - ISLEPROGRESS.HTML - LEGO1PROGRESS.HTML - ISLEPROGRESS.SVG - LEGO1PROGRESS.SVG + build/ISLE.EXE + build/LEGO1.DLL + + - name: Upload Artifact + uses: actions/upload-artifact@master + with: + name: Accuracy Report + path: | + ISLEPROGRESS.* + LEGO1PROGRESS.* - name: Upload Continuous Release shell: bash @@ -100,13 +129,7 @@ jobs: curl -fLOSs https://raw.githubusercontent.com/probonopd/uploadtool/master/upload.sh ./upload.sh \ - Release/ISLE.EXE \ - Release/LEGO1.DLL \ - ISLEPROGRESS.HTML \ - ISLEPROGRESS.TXT \ - ISLEPROGRESS.SVG \ - ISLEPROGRESS.PNG \ - LEGO1PROGRESS.HTML \ - LEGO1PROGRESS.TXT \ - LEGO1PROGRESS.PNG \ - LEGO1PROGRESS.SVG + build/ISLE.EXE \ + build/LEGO1.DLL \ + ISLEPROGRESS.* \ + LEGO1PROGRESS.* diff --git a/.gitignore b/.gitignore index ef562599..14ad2717 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ Release/ *.ncb ISLE.EXE LEGO1.DLL +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..11927c11 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,212 @@ +cmake_minimum_required(VERSION 2.8...3.5 FATAL_ERROR) + +project(isle CXX) + +option(ISLE_BUILD_APP "Build ISLE.EXE application" ON) +option(ISLE_BUILD_LIB "Build LEGO1.DLL library" ON) + +if (ISLE_BUILD_APP) + add_executable(isle WIN32 + ISLE/res/isle.rc + ISLE/isleapp.cpp + ISLE/define.cpp + ) + + # Include LEGO1 headers in ISLE + target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1") + + # Link DSOUND, WINMM, and our fake LEGO1 lib (TODO: replace with real once all exports are implemented) + target_link_libraries(isle PRIVATE dsound winmm "${CMAKE_SOURCE_DIR}/ISLE/ext/lego1.lib") + + # Make sure filenames are ALL CAPS + set_property(TARGET isle PROPERTY OUTPUT_NAME ISLE) + set_property(TARGET isle PROPERTY SUFFIX ".EXE") +endif() + +if (ISLE_BUILD_LIB) + add_library(lego1 SHARED + LEGO1/act1state.cpp + LEGO1/act2brick.cpp + LEGO1/act2policestation.cpp + LEGO1/act3.cpp + LEGO1/act3shark.cpp + LEGO1/act3state.cpp + LEGO1/ambulance.cpp + LEGO1/ambulancemissionstate.cpp + LEGO1/animstate.cpp + LEGO1/beachhouseentity.cpp + LEGO1/bike.cpp + LEGO1/buildingentity.cpp + LEGO1/bumpbouy.cpp + LEGO1/carrace.cpp + LEGO1/dllmain.cpp + LEGO1/dunebuggy.cpp + LEGO1/elevatorbottom.cpp + LEGO1/gasstation.cpp + LEGO1/gasstationentity.cpp + LEGO1/gasstationstate.cpp + LEGO1/helicopter.cpp + LEGO1/helicopterstate.cpp + LEGO1/historybook.cpp + LEGO1/hospital.cpp + LEGO1/hospitalentity.cpp + LEGO1/hospitalstate.cpp + LEGO1/infocenter.cpp + LEGO1/infocenterdoor.cpp + LEGO1/infocenterentity.cpp + LEGO1/infocenterstate.cpp + LEGO1/isle.cpp + LEGO1/isleactor.cpp + LEGO1/islepathactor.cpp + LEGO1/jetski.cpp + LEGO1/jetskirace.cpp + LEGO1/jukebox.cpp + LEGO1/jukeboxentity.cpp + LEGO1/jukeboxstate.cpp + LEGO1/legoact2state.cpp + LEGO1/legoactioncontrolpresenter.cpp + LEGO1/legoanimactor.cpp + LEGO1/legoanimationmanager.cpp + LEGO1/legoanimmmpresenter.cpp + LEGO1/legoanimpresenter.cpp + LEGO1/legobuildingmanager.cpp + LEGO1/legocachesound.cpp + LEGO1/legocameracontroller.cpp + LEGO1/legocarbuild.cpp + LEGO1/legocarbuildanimpresenter.cpp + LEGO1/legocontrolmanager.cpp + LEGO1/legoentity.cpp + LEGO1/legoentitypresenter.cpp + LEGO1/legoflctexturepresenter.cpp + LEGO1/legohideanimpresenter.cpp + LEGO1/legoinputmanager.cpp + LEGO1/legojetski.cpp + LEGO1/legoloadcachesoundpresenter.cpp + LEGO1/legolocomotionanimpresenter.cpp + LEGO1/legonavcontroller.cpp + LEGO1/legoomni.cpp + LEGO1/legopalettepresenter.cpp + LEGO1/legopathactor.cpp + LEGO1/legopathcontroller.cpp + LEGO1/legopathpresenter.cpp + LEGO1/legophonemepresenter.cpp + LEGO1/legoplantmanager.cpp + LEGO1/legorace.cpp + LEGO1/legosoundmanager.cpp + LEGO1/legostate.cpp + LEGO1/legotexturepresenter.cpp + LEGO1/legovideomanager.cpp + LEGO1/legoworld.cpp + LEGO1/legoworldpresenter.cpp + LEGO1/motorcycle.cpp + LEGO1/mxatomid.cpp + LEGO1/mxaudiopresenter.cpp + LEGO1/mxautolocker.cpp + LEGO1/mxbackgroundaudiomanager.cpp + LEGO1/mxcompositemediapresenter.cpp + LEGO1/mxcompositepresenter.cpp + LEGO1/mxcontrolpresenter.cpp + LEGO1/mxcore.cpp + LEGO1/mxcriticalsection.cpp + LEGO1/mxdiskstreamcontroller.cpp + LEGO1/mxdiskstreamprovider.cpp + LEGO1/mxdsaction.cpp + LEGO1/mxdsanim.cpp + LEGO1/mxdschunk.cpp + LEGO1/mxdsevent.cpp + LEGO1/mxdsfile.cpp + LEGO1/mxdsmediaaction.cpp + LEGO1/mxdsmultiaction.cpp + LEGO1/mxdsobject.cpp + LEGO1/mxdsobjectaction.cpp + LEGO1/mxdsparallelaction.cpp + LEGO1/mxdsselectaction.cpp + LEGO1/mxdsserialaction.cpp + LEGO1/mxdssound.cpp + LEGO1/mxdssource.cpp + LEGO1/mxdsstill.cpp + LEGO1/mxdssubscriber.cpp + LEGO1/mxentity.cpp + LEGO1/mxeventmanager.cpp + LEGO1/mxeventpresenter.cpp + LEGO1/mxflcpresenter.cpp + LEGO1/mxioinfo.cpp + LEGO1/mxloopingflcpresenter.cpp + LEGO1/mxloopingsmkpresenter.cpp + LEGO1/mxmediapresenter.cpp + LEGO1/mxmusicpresenter.cpp + LEGO1/mxnotificationmanager.cpp + LEGO1/mxomni.cpp + LEGO1/mxomnicreateflags.cpp + LEGO1/mxomnicreateparam.cpp + LEGO1/mxomnicreateparambase.cpp + LEGO1/mxpalette.cpp + LEGO1/mxpresenter.cpp + LEGO1/mxsmkpresenter.cpp + LEGO1/mxsoundmanager.cpp + LEGO1/mxsoundpresenter.cpp + LEGO1/mxstillpresenter.cpp + LEGO1/mxstreamer.cpp + LEGO1/mxstring.cpp + LEGO1/mxtimer.cpp + LEGO1/mxtransitionmanager.cpp + LEGO1/mxunknown100dc6b0.cpp + LEGO1/mxvideomanager.cpp + LEGO1/mxvideoparam.cpp + LEGO1/mxvideoparamflags.cpp + LEGO1/mxvideopresenter.cpp + LEGO1/mxwavepresenter.cpp + LEGO1/pizza.cpp + LEGO1/pizzamissionstate.cpp + LEGO1/pizzeria.cpp + LEGO1/pizzeriastate.cpp + LEGO1/police.cpp + LEGO1/policeentity.cpp + LEGO1/policestate.cpp + LEGO1/racecar.cpp + LEGO1/racestandsentity.cpp + LEGO1/racestate.cpp + LEGO1/radio.cpp + LEGO1/radiostate.cpp + LEGO1/registrationbook.cpp + LEGO1/score.cpp + LEGO1/scorestate.cpp + LEGO1/skateboard.cpp + LEGO1/towtrack.cpp + LEGO1/towtrackmissionstate.cpp + ) + + # Link libraries + target_link_libraries(lego1 PRIVATE ddraw dsound winmm) + + # Make sure filenames are ALL CAPS + set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1) + set_property(TARGET lego1 PROPERTY SUFFIX ".DLL") +endif() + +if (MSVC) + # These flags have been taken from the defaults for a Visual C++ 4.20 project (the compiler the + # game was originally built with) and tweaked slightly to produce more debugging info for reccmp. + # They ensure a recompilation that can be byte/instruction accurate to the original binaries. + + target_compile_options(isle PRIVATE "/ML$<$:d>") + target_compile_options(lego1 PRIVATE "/MT$<$:d>") + + set(CMAKE_CXX_FLAGS "/W3 /GX /D \"WIN32\" /D \"_WINDOWS\"") + set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Zi /Od /D \"_DEBUG\"") + set(CMAKE_CXX_FLAGS_RELEASE "/O2 /D \"NDEBUG\"") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/Zi /O2 /D \"NDEBUG\"") + set(CMAKE_CXX_FLAGS_MINSIZEREL "/Os /D \"NDEBUG\"") + + set(CMAKE_EXE_LINKER_FLAGS "/machine:I386") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/incremental:yes /debug") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/incremental:no") + set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/incremental:no /debug") + set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "/incremental:no") + + set(CMAKE_SHARED_LINKER_FLAGS "/machine:I386") + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/incremental:yes /debug") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/incremental:no") + set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "/incremental:no /debug") + set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "/incremental:no") +endif() diff --git a/ISLE/res/isle.rc b/ISLE/res/isle.rc index 4534ea64..95432e06 100644 --- a/ISLE/res/isle.rc +++ b/ISLE/res/isle.rc @@ -1,9 +1,9 @@ #include "resource.h" -ISLE_ARROW CURSOR "ISLE/res/arrow.cur" -ISLE_NO CURSOR "ISLE/res/no.cur" -ISLE_BUSY CURSOR "ISLE/res/busy.cur" -APP_ICON ICON "ISLE/res/isle.ico" +ISLE_ARROW CURSOR "arrow.cur" +ISLE_NO CURSOR "no.cur" +ISLE_BUSY CURSOR "busy.cur" +APP_ICON ICON "isle.ico" 1 VERSIONINFO FILEVERSION 1,1,0,0 diff --git a/isle.mak b/isle.mak deleted file mode 100644 index 90a2cead..00000000 --- a/isle.mak +++ /dev/null @@ -1,4681 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Format Version 4.20 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -!IF "$(CFG)" == "" -CFG=LEGO1 - Win32 Release -!MESSAGE No configuration specified. Defaulting to LEGO1 - Win32 Release. -!ENDIF - -!IF "$(CFG)" != "LEGO1 - Win32 Release" && "$(CFG)" != "LEGO1 - Win32 Debug" &&\ - "$(CFG)" != "ISLE - Win32 Release" && "$(CFG)" != "ISLE - Win32 Debug" -!MESSAGE Invalid configuration "$(CFG)" specified. -!MESSAGE You can specify a configuration when running NMAKE on this makefile -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "isle.mak" CFG="LEGO1 - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "LEGO1 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "LEGO1 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "ISLE - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "ISLE - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF -################################################################################ -# Begin Project -# PROP Target_Last_Scanned "ISLE - Win32 Debug" - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "LEGO1\Release" -# PROP BASE Intermediate_Dir "LEGO1\Release" -# PROP BASE Target_Dir "LEGO1" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "LEGO1\Release" -# PROP Intermediate_Dir "LEGO1\Release" -# PROP Target_Dir "LEGO1" -OUTDIR=.\LEGO1\Release -INTDIR=.\LEGO1\Release - -ALL : ".\Release\LEGO1.DLL" - -CLEAN : - -@erase "$(INTDIR)\act1state.obj" - -@erase "$(INTDIR)\act2brick.obj" - -@erase "$(INTDIR)\act2policestation.obj" - -@erase "$(INTDIR)\act3.obj" - -@erase "$(INTDIR)\act3shark.obj" - -@erase "$(INTDIR)\act3state.obj" - -@erase "$(INTDIR)\ambulance.obj" - -@erase "$(INTDIR)\ambulancemissionstate.obj" - -@erase "$(INTDIR)\animstate.obj" - -@erase "$(INTDIR)\beachhouseentity.obj" - -@erase "$(INTDIR)\bike.obj" - -@erase "$(INTDIR)\buildingentity.obj" - -@erase "$(INTDIR)\bumpbouy.obj" - -@erase "$(INTDIR)\carrace.obj" - -@erase "$(INTDIR)\dllmain.obj" - -@erase "$(INTDIR)\dunebuggy.obj" - -@erase "$(INTDIR)\elevatorbottom.obj" - -@erase "$(INTDIR)\gasstation.obj" - -@erase "$(INTDIR)\gasstationentity.obj" - -@erase "$(INTDIR)\gasstationstate.obj" - -@erase "$(INTDIR)\helicopter.obj" - -@erase "$(INTDIR)\helicopterstate.obj" - -@erase "$(INTDIR)\historybook.obj" - -@erase "$(INTDIR)\hospital.obj" - -@erase "$(INTDIR)\hospitalentity.obj" - -@erase "$(INTDIR)\hospitalstate.obj" - -@erase "$(INTDIR)\infocenter.obj" - -@erase "$(INTDIR)\infocenterdoor.obj" - -@erase "$(INTDIR)\infocenterentity.obj" - -@erase "$(INTDIR)\infocenterstate.obj" - -@erase "$(INTDIR)\isle.obj" - -@erase "$(INTDIR)\isleactor.obj" - -@erase "$(INTDIR)\islepathactor.obj" - -@erase "$(INTDIR)\jetski.obj" - -@erase "$(INTDIR)\jetskiRace.obj" - -@erase "$(INTDIR)\jukebox.obj" - -@erase "$(INTDIR)\jukeboxentity.obj" - -@erase "$(INTDIR)\jukeboxstate.obj" - -@erase "$(INTDIR)\legoact2state.obj" - -@erase "$(INTDIR)\legoactioncontrolpresenter.obj" - -@erase "$(INTDIR)\legoanimactor.obj" - -@erase "$(INTDIR)\legoanimationmanager.obj" - -@erase "$(INTDIR)\legoanimmmpresenter.obj" - -@erase "$(INTDIR)\legoanimpresenter.obj" - -@erase "$(INTDIR)\legobuildingmanager.obj" - -@erase "$(INTDIR)\legocachesound.obj" - -@erase "$(INTDIR)\legocameracontroller.obj" - -@erase "$(INTDIR)\legocarbuild.obj" - -@erase "$(INTDIR)\legocarbuildanimpresenter.obj" - -@erase "$(INTDIR)\legocontrolmanager.obj" - -@erase "$(INTDIR)\legoentity.obj" - -@erase "$(INTDIR)\legoentitypresenter.obj" - -@erase "$(INTDIR)\legoflctexturepresenter.obj" - -@erase "$(INTDIR)\legohideanimpresenter.obj" - -@erase "$(INTDIR)\legoinputmanager.obj" - -@erase "$(INTDIR)\legojetski.obj" - -@erase "$(INTDIR)\legoloadcachesoundpresenter.obj" - -@erase "$(INTDIR)\legolocomotionanimpresenter.obj" - -@erase "$(INTDIR)\legonavcontroller.obj" - -@erase "$(INTDIR)\legoomni.obj" - -@erase "$(INTDIR)\legopalettepresenter.obj" - -@erase "$(INTDIR)\legopathactor.obj" - -@erase "$(INTDIR)\legopathcontroller.obj" - -@erase "$(INTDIR)\legopathpresenter.obj" - -@erase "$(INTDIR)\legophonemepresenter.obj" - -@erase "$(INTDIR)\legoplantmanager.obj" - -@erase "$(INTDIR)\legorace.obj" - -@erase "$(INTDIR)\legosoundmanager.obj" - -@erase "$(INTDIR)\legostate.obj" - -@erase "$(INTDIR)\legotexturepresenter.obj" - -@erase "$(INTDIR)\legovideomanager.obj" - -@erase "$(INTDIR)\legoworld.obj" - -@erase "$(INTDIR)\legoworldpresenter.obj" - -@erase "$(INTDIR)\motorcycle.obj" - -@erase "$(INTDIR)\mxatomid.obj" - -@erase "$(INTDIR)\mxaudiopresenter.obj" - -@erase "$(INTDIR)\mxautolocker.obj" - -@erase "$(INTDIR)\mxbackgroundaudiomanager.obj" - -@erase "$(INTDIR)\mxcompositemediapresenter.obj" - -@erase "$(INTDIR)\mxcompositepresenter.obj" - -@erase "$(INTDIR)\mxcontrolpresenter.obj" - -@erase "$(INTDIR)\mxcore.obj" - -@erase "$(INTDIR)\mxcriticalsection.obj" - -@erase "$(INTDIR)\mxdiskstreamcontroller.obj" - -@erase "$(INTDIR)\mxdiskstreamprovider.obj" - -@erase "$(INTDIR)\mxdsaction.obj" - -@erase "$(INTDIR)\mxdsanim.obj" - -@erase "$(INTDIR)\mxdschunk.obj" - -@erase "$(INTDIR)\mxdsevent.obj" - -@erase "$(INTDIR)\mxdsfile.obj" - -@erase "$(INTDIR)\mxdsmediaaction.obj" - -@erase "$(INTDIR)\mxdsmultiaction.obj" - -@erase "$(INTDIR)\mxdsobject.obj" - -@erase "$(INTDIR)\mxdsobjectaction.obj" - -@erase "$(INTDIR)\mxdsparallelaction.obj" - -@erase "$(INTDIR)\mxdsselectaction.obj" - -@erase "$(INTDIR)\mxdsserialaction.obj" - -@erase "$(INTDIR)\mxdssound.obj" - -@erase "$(INTDIR)\mxdssource.obj" - -@erase "$(INTDIR)\mxdsstill.obj" - -@erase "$(INTDIR)\mxdssubscriber.obj" - -@erase "$(INTDIR)\mxentity.obj" - -@erase "$(INTDIR)\mxeventmanager.obj" - -@erase "$(INTDIR)\mxeventpresenter.obj" - -@erase "$(INTDIR)\mxflcpresenter.obj" - -@erase "$(INTDIR)\mxioinfo.obj" - -@erase "$(INTDIR)\mxloopingflcpresenter.obj" - -@erase "$(INTDIR)\mxloopingsmkpresenter.obj" - -@erase "$(INTDIR)\mxmediapresenter.obj" - -@erase "$(INTDIR)\mxmusicpresenter.obj" - -@erase "$(INTDIR)\mxnotificationmanager.obj" - -@erase "$(INTDIR)\mxomni.obj" - -@erase "$(INTDIR)\mxomnicreateflags.obj" - -@erase "$(INTDIR)\mxomnicreateparam.obj" - -@erase "$(INTDIR)\mxomnicreateparambase.obj" - -@erase "$(INTDIR)\mxpalette.obj" - -@erase "$(INTDIR)\mxpresenter.obj" - -@erase "$(INTDIR)\mxsmkpresenter.obj" - -@erase "$(INTDIR)\mxsoundmanager.obj" - -@erase "$(INTDIR)\mxsoundpresenter.obj" - -@erase "$(INTDIR)\mxstillpresenter.obj" - -@erase "$(INTDIR)\mxstreamer.obj" - -@erase "$(INTDIR)\mxstring.obj" - -@erase "$(INTDIR)\mxtimer.obj" - -@erase "$(INTDIR)\mxtransitionmanager.obj" - -@erase "$(INTDIR)\mxunknown100dc6b0.obj" - -@erase "$(INTDIR)\mxvideomanager.obj" - -@erase "$(INTDIR)\mxvideoparam.obj" - -@erase "$(INTDIR)\mxvideoparamflags.obj" - -@erase "$(INTDIR)\mxvideopresenter.obj" - -@erase "$(INTDIR)\mxwavepresenter.obj" - -@erase "$(INTDIR)\pizza.obj" - -@erase "$(INTDIR)\pizzeria.obj" - -@erase "$(INTDIR)\pizzeriastate.obj" - -@erase "$(INTDIR)\police.obj" - -@erase "$(INTDIR)\policeentity.obj" - -@erase "$(INTDIR)\policestate.obj" - -@erase "$(INTDIR)\racecar.obj" - -@erase "$(INTDIR)\racestandsentity.obj" - -@erase "$(INTDIR)\racestate.obj" - -@erase "$(INTDIR)\radio.obj" - -@erase "$(INTDIR)\radiostate.obj" - -@erase "$(INTDIR)\registrationbook.obj" - -@erase "$(INTDIR)\score.obj" - -@erase "$(INTDIR)\skateboard.obj" - -@erase "$(INTDIR)\towtrack.obj" - -@erase "$(INTDIR)\towtrackmissionstate.obj" - -@erase "$(INTDIR)\vc40.pdb" - -@erase ".\Release\LEGO1.DLL" - -@erase ".\Release\LEGO1.EXP" - -@erase ".\Release\LEGO1.LIB" - -@erase ".\Release\LEGO1.PDB" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /MT /W3 /GX /Zi /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\ - /Fp"$(INTDIR)/LEGO1.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\LEGO1\Release/ -CPP_SBRS=.\. - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -MTL=mktyplib.exe -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/LEGO1.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /pdb:"Release/LEGO1.PDB" /debug /machine:I386 /out:"Release/LEGO1.DLL" /implib:"Release/LEGO1.LIB" -# SUBTRACT LINK32 /pdb:none /map -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ - odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /incremental:no\ - /pdb:"Release/LEGO1.PDB" /debug /machine:I386 /out:"Release/LEGO1.DLL"\ - /implib:"Release/LEGO1.LIB" -LINK32_OBJS= \ - "$(INTDIR)\act1state.obj" \ - "$(INTDIR)\act2brick.obj" \ - "$(INTDIR)\act2policestation.obj" \ - "$(INTDIR)\act3.obj" \ - "$(INTDIR)\act3shark.obj" \ - "$(INTDIR)\act3state.obj" \ - "$(INTDIR)\ambulance.obj" \ - "$(INTDIR)\ambulancemissionstate.obj" \ - "$(INTDIR)\animstate.obj" \ - "$(INTDIR)\beachhouseentity.obj" \ - "$(INTDIR)\bike.obj" \ - "$(INTDIR)\buildingentity.obj" \ - "$(INTDIR)\bumpbouy.obj" \ - "$(INTDIR)\carrace.obj" \ - "$(INTDIR)\dllmain.obj" \ - "$(INTDIR)\dunebuggy.obj" \ - "$(INTDIR)\elevatorbottom.obj" \ - "$(INTDIR)\gasstation.obj" \ - "$(INTDIR)\gasstationentity.obj" \ - "$(INTDIR)\gasstationstate.obj" \ - "$(INTDIR)\helicopter.obj" \ - "$(INTDIR)\helicopterstate.obj" \ - "$(INTDIR)\historybook.obj" \ - "$(INTDIR)\hospital.obj" \ - "$(INTDIR)\hospitalentity.obj" \ - "$(INTDIR)\hospitalstate.obj" \ - "$(INTDIR)\infocenter.obj" \ - "$(INTDIR)\infocenterdoor.obj" \ - "$(INTDIR)\infocenterentity.obj" \ - "$(INTDIR)\infocenterstate.obj" \ - "$(INTDIR)\isle.obj" \ - "$(INTDIR)\isleactor.obj" \ - "$(INTDIR)\islepathactor.obj" \ - "$(INTDIR)\jetski.obj" \ - "$(INTDIR)\jetskiRace.obj" \ - "$(INTDIR)\jukebox.obj" \ - "$(INTDIR)\jukeboxentity.obj" \ - "$(INTDIR)\jukeboxstate.obj" \ - "$(INTDIR)\legoact2state.obj" \ - "$(INTDIR)\legoactioncontrolpresenter.obj" \ - "$(INTDIR)\legoanimactor.obj" \ - "$(INTDIR)\legoanimationmanager.obj" \ - "$(INTDIR)\legoanimmmpresenter.obj" \ - "$(INTDIR)\legoanimpresenter.obj" \ - "$(INTDIR)\legobuildingmanager.obj" \ - "$(INTDIR)\legocachesound.obj" \ - "$(INTDIR)\legocameracontroller.obj" \ - "$(INTDIR)\legocarbuild.obj" \ - "$(INTDIR)\legocarbuildanimpresenter.obj" \ - "$(INTDIR)\legocontrolmanager.obj" \ - "$(INTDIR)\legoentity.obj" \ - "$(INTDIR)\legoentitypresenter.obj" \ - "$(INTDIR)\legoflctexturepresenter.obj" \ - "$(INTDIR)\legohideanimpresenter.obj" \ - "$(INTDIR)\legoinputmanager.obj" \ - "$(INTDIR)\legojetski.obj" \ - "$(INTDIR)\legoloadcachesoundpresenter.obj" \ - "$(INTDIR)\legolocomotionanimpresenter.obj" \ - "$(INTDIR)\legonavcontroller.obj" \ - "$(INTDIR)\legoomni.obj" \ - "$(INTDIR)\legopalettepresenter.obj" \ - "$(INTDIR)\legopathactor.obj" \ - "$(INTDIR)\legopathcontroller.obj" \ - "$(INTDIR)\legopathpresenter.obj" \ - "$(INTDIR)\legophonemepresenter.obj" \ - "$(INTDIR)\legoplantmanager.obj" \ - "$(INTDIR)\legorace.obj" \ - "$(INTDIR)\legosoundmanager.obj" \ - "$(INTDIR)\legostate.obj" \ - "$(INTDIR)\legotexturepresenter.obj" \ - "$(INTDIR)\legovideomanager.obj" \ - "$(INTDIR)\legoworld.obj" \ - "$(INTDIR)\legoworldpresenter.obj" \ - "$(INTDIR)\motorcycle.obj" \ - "$(INTDIR)\mxatomid.obj" \ - "$(INTDIR)\mxaudiopresenter.obj" \ - "$(INTDIR)\mxautolocker.obj" \ - "$(INTDIR)\mxbackgroundaudiomanager.obj" \ - "$(INTDIR)\mxcompositemediapresenter.obj" \ - "$(INTDIR)\mxcompositepresenter.obj" \ - "$(INTDIR)\mxcontrolpresenter.obj" \ - "$(INTDIR)\mxcore.obj" \ - "$(INTDIR)\mxcriticalsection.obj" \ - "$(INTDIR)\mxdiskstreamcontroller.obj" \ - "$(INTDIR)\mxdiskstreamprovider.obj" \ - "$(INTDIR)\mxdsaction.obj" \ - "$(INTDIR)\mxdsanim.obj" \ - "$(INTDIR)\mxdschunk.obj" \ - "$(INTDIR)\mxdsevent.obj" \ - "$(INTDIR)\mxdsfile.obj" \ - "$(INTDIR)\mxdsmediaaction.obj" \ - "$(INTDIR)\mxdsmultiaction.obj" \ - "$(INTDIR)\mxdsobject.obj" \ - "$(INTDIR)\mxdsobjectaction.obj" \ - "$(INTDIR)\mxdsparallelaction.obj" \ - "$(INTDIR)\mxdsselectaction.obj" \ - "$(INTDIR)\mxdsserialaction.obj" \ - "$(INTDIR)\mxdssound.obj" \ - "$(INTDIR)\mxdssource.obj" \ - "$(INTDIR)\mxdsstill.obj" \ - "$(INTDIR)\mxdssubscriber.obj" \ - "$(INTDIR)\mxentity.obj" \ - "$(INTDIR)\mxeventmanager.obj" \ - "$(INTDIR)\mxeventpresenter.obj" \ - "$(INTDIR)\mxflcpresenter.obj" \ - "$(INTDIR)\mxioinfo.obj" \ - "$(INTDIR)\mxloopingflcpresenter.obj" \ - "$(INTDIR)\mxloopingsmkpresenter.obj" \ - "$(INTDIR)\mxmediapresenter.obj" \ - "$(INTDIR)\mxmusicpresenter.obj" \ - "$(INTDIR)\mxnotificationmanager.obj" \ - "$(INTDIR)\mxomni.obj" \ - "$(INTDIR)\mxomnicreateflags.obj" \ - "$(INTDIR)\mxomnicreateparam.obj" \ - "$(INTDIR)\mxomnicreateparambase.obj" \ - "$(INTDIR)\mxpalette.obj" \ - "$(INTDIR)\mxpresenter.obj" \ - "$(INTDIR)\mxsmkpresenter.obj" \ - "$(INTDIR)\mxsoundmanager.obj" \ - "$(INTDIR)\mxsoundpresenter.obj" \ - "$(INTDIR)\mxstillpresenter.obj" \ - "$(INTDIR)\mxstreamer.obj" \ - "$(INTDIR)\mxstring.obj" \ - "$(INTDIR)\mxtimer.obj" \ - "$(INTDIR)\mxtransitionmanager.obj" \ - "$(INTDIR)\mxunknown100dc6b0.obj" \ - "$(INTDIR)\mxvideomanager.obj" \ - "$(INTDIR)\mxvideoparam.obj" \ - "$(INTDIR)\mxvideoparamflags.obj" \ - "$(INTDIR)\mxvideopresenter.obj" \ - "$(INTDIR)\mxwavepresenter.obj" \ - "$(INTDIR)\pizza.obj" \ - "$(INTDIR)\pizzeria.obj" \ - "$(INTDIR)\pizzeriastate.obj" \ - "$(INTDIR)\police.obj" \ - "$(INTDIR)\policeentity.obj" \ - "$(INTDIR)\policestate.obj" \ - "$(INTDIR)\racecar.obj" \ - "$(INTDIR)\racestandsentity.obj" \ - "$(INTDIR)\racestate.obj" \ - "$(INTDIR)\radio.obj" \ - "$(INTDIR)\radiostate.obj" \ - "$(INTDIR)\registrationbook.obj" \ - "$(INTDIR)\score.obj" \ - "$(INTDIR)\skateboard.obj" \ - "$(INTDIR)\towtrack.obj" \ - "$(INTDIR)\towtrackmissionstate.obj" - -".\Release\LEGO1.DLL" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "LEGO1\Debug" -# PROP BASE Intermediate_Dir "LEGO1\Debug" -# PROP BASE Target_Dir "LEGO1" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "LEGO1\Debug" -# PROP Intermediate_Dir "LEGO1\Debug" -# PROP Target_Dir "LEGO1" -OUTDIR=.\LEGO1\Debug -INTDIR=.\LEGO1\Debug - -ALL : ".\Debug\LEGO1.DLL" - -CLEAN : - -@erase "$(INTDIR)\act1state.obj" - -@erase "$(INTDIR)\act2brick.obj" - -@erase "$(INTDIR)\act2policestation.obj" - -@erase "$(INTDIR)\act3.obj" - -@erase "$(INTDIR)\act3shark.obj" - -@erase "$(INTDIR)\act3state.obj" - -@erase "$(INTDIR)\ambulance.obj" - -@erase "$(INTDIR)\ambulancemissionstate.obj" - -@erase "$(INTDIR)\animstate.obj" - -@erase "$(INTDIR)\beachhouseentity.obj" - -@erase "$(INTDIR)\bike.obj" - -@erase "$(INTDIR)\buildingentity.obj" - -@erase "$(INTDIR)\bumpbouy.obj" - -@erase "$(INTDIR)\carrace.obj" - -@erase "$(INTDIR)\dllmain.obj" - -@erase "$(INTDIR)\dunebuggy.obj" - -@erase "$(INTDIR)\elevatorbottom.obj" - -@erase "$(INTDIR)\gasstation.obj" - -@erase "$(INTDIR)\gasstationentity.obj" - -@erase "$(INTDIR)\gasstationstate.obj" - -@erase "$(INTDIR)\helicopter.obj" - -@erase "$(INTDIR)\helicopterstate.obj" - -@erase "$(INTDIR)\historybook.obj" - -@erase "$(INTDIR)\hospital.obj" - -@erase "$(INTDIR)\hospitalentity.obj" - -@erase "$(INTDIR)\hospitalstate.obj" - -@erase "$(INTDIR)\infocenter.obj" - -@erase "$(INTDIR)\infocenterdoor.obj" - -@erase "$(INTDIR)\infocenterentity.obj" - -@erase "$(INTDIR)\infocenterstate.obj" - -@erase "$(INTDIR)\isle.obj" - -@erase "$(INTDIR)\isleactor.obj" - -@erase "$(INTDIR)\islepathactor.obj" - -@erase "$(INTDIR)\jetski.obj" - -@erase "$(INTDIR)\jetskiRace.obj" - -@erase "$(INTDIR)\jukebox.obj" - -@erase "$(INTDIR)\jukeboxentity.obj" - -@erase "$(INTDIR)\jukeboxstate.obj" - -@erase "$(INTDIR)\legoact2state.obj" - -@erase "$(INTDIR)\legoactioncontrolpresenter.obj" - -@erase "$(INTDIR)\legoanimactor.obj" - -@erase "$(INTDIR)\legoanimationmanager.obj" - -@erase "$(INTDIR)\legoanimmmpresenter.obj" - -@erase "$(INTDIR)\legoanimpresenter.obj" - -@erase "$(INTDIR)\legobuildingmanager.obj" - -@erase "$(INTDIR)\legocachesound.obj" - -@erase "$(INTDIR)\legocameracontroller.obj" - -@erase "$(INTDIR)\legocarbuild.obj" - -@erase "$(INTDIR)\legocarbuildanimpresenter.obj" - -@erase "$(INTDIR)\legocontrolmanager.obj" - -@erase "$(INTDIR)\legoentity.obj" - -@erase "$(INTDIR)\legoentitypresenter.obj" - -@erase "$(INTDIR)\legoflctexturepresenter.obj" - -@erase "$(INTDIR)\legohideanimpresenter.obj" - -@erase "$(INTDIR)\legoinputmanager.obj" - -@erase "$(INTDIR)\legojetski.obj" - -@erase "$(INTDIR)\legoloadcachesoundpresenter.obj" - -@erase "$(INTDIR)\legolocomotionanimpresenter.obj" - -@erase "$(INTDIR)\legonavcontroller.obj" - -@erase "$(INTDIR)\legoomni.obj" - -@erase "$(INTDIR)\legopalettepresenter.obj" - -@erase "$(INTDIR)\legopathactor.obj" - -@erase "$(INTDIR)\legopathcontroller.obj" - -@erase "$(INTDIR)\legopathpresenter.obj" - -@erase "$(INTDIR)\legophonemepresenter.obj" - -@erase "$(INTDIR)\legoplantmanager.obj" - -@erase "$(INTDIR)\legorace.obj" - -@erase "$(INTDIR)\legosoundmanager.obj" - -@erase "$(INTDIR)\legostate.obj" - -@erase "$(INTDIR)\legotexturepresenter.obj" - -@erase "$(INTDIR)\legovideomanager.obj" - -@erase "$(INTDIR)\legoworld.obj" - -@erase "$(INTDIR)\legoworldpresenter.obj" - -@erase "$(INTDIR)\motorcycle.obj" - -@erase "$(INTDIR)\mxatomid.obj" - -@erase "$(INTDIR)\mxaudiopresenter.obj" - -@erase "$(INTDIR)\mxautolocker.obj" - -@erase "$(INTDIR)\mxbackgroundaudiomanager.obj" - -@erase "$(INTDIR)\mxcompositemediapresenter.obj" - -@erase "$(INTDIR)\mxcompositepresenter.obj" - -@erase "$(INTDIR)\mxcontrolpresenter.obj" - -@erase "$(INTDIR)\mxcore.obj" - -@erase "$(INTDIR)\mxcriticalsection.obj" - -@erase "$(INTDIR)\mxdiskstreamcontroller.obj" - -@erase "$(INTDIR)\mxdiskstreamprovider.obj" - -@erase "$(INTDIR)\mxdsaction.obj" - -@erase "$(INTDIR)\mxdsanim.obj" - -@erase "$(INTDIR)\mxdschunk.obj" - -@erase "$(INTDIR)\mxdsevent.obj" - -@erase "$(INTDIR)\mxdsfile.obj" - -@erase "$(INTDIR)\mxdsmediaaction.obj" - -@erase "$(INTDIR)\mxdsmultiaction.obj" - -@erase "$(INTDIR)\mxdsobject.obj" - -@erase "$(INTDIR)\mxdsobjectaction.obj" - -@erase "$(INTDIR)\mxdsparallelaction.obj" - -@erase "$(INTDIR)\mxdsselectaction.obj" - -@erase "$(INTDIR)\mxdsserialaction.obj" - -@erase "$(INTDIR)\mxdssound.obj" - -@erase "$(INTDIR)\mxdssource.obj" - -@erase "$(INTDIR)\mxdsstill.obj" - -@erase "$(INTDIR)\mxdssubscriber.obj" - -@erase "$(INTDIR)\mxentity.obj" - -@erase "$(INTDIR)\mxeventmanager.obj" - -@erase "$(INTDIR)\mxeventpresenter.obj" - -@erase "$(INTDIR)\mxflcpresenter.obj" - -@erase "$(INTDIR)\mxioinfo.obj" - -@erase "$(INTDIR)\mxloopingflcpresenter.obj" - -@erase "$(INTDIR)\mxloopingsmkpresenter.obj" - -@erase "$(INTDIR)\mxmediapresenter.obj" - -@erase "$(INTDIR)\mxmusicpresenter.obj" - -@erase "$(INTDIR)\mxnotificationmanager.obj" - -@erase "$(INTDIR)\mxomni.obj" - -@erase "$(INTDIR)\mxomnicreateflags.obj" - -@erase "$(INTDIR)\mxomnicreateparam.obj" - -@erase "$(INTDIR)\mxomnicreateparambase.obj" - -@erase "$(INTDIR)\mxpalette.obj" - -@erase "$(INTDIR)\mxpresenter.obj" - -@erase "$(INTDIR)\mxsmkpresenter.obj" - -@erase "$(INTDIR)\mxsoundmanager.obj" - -@erase "$(INTDIR)\mxsoundpresenter.obj" - -@erase "$(INTDIR)\mxstillpresenter.obj" - -@erase "$(INTDIR)\mxstreamer.obj" - -@erase "$(INTDIR)\mxstring.obj" - -@erase "$(INTDIR)\mxtimer.obj" - -@erase "$(INTDIR)\mxtransitionmanager.obj" - -@erase "$(INTDIR)\mxunknown100dc6b0.obj" - -@erase "$(INTDIR)\mxvideomanager.obj" - -@erase "$(INTDIR)\mxvideoparam.obj" - -@erase "$(INTDIR)\mxvideoparamflags.obj" - -@erase "$(INTDIR)\mxvideopresenter.obj" - -@erase "$(INTDIR)\mxwavepresenter.obj" - -@erase "$(INTDIR)\pizza.obj" - -@erase "$(INTDIR)\pizzeria.obj" - -@erase "$(INTDIR)\pizzeriastate.obj" - -@erase "$(INTDIR)\police.obj" - -@erase "$(INTDIR)\policeentity.obj" - -@erase "$(INTDIR)\policestate.obj" - -@erase "$(INTDIR)\racecar.obj" - -@erase "$(INTDIR)\racestandsentity.obj" - -@erase "$(INTDIR)\racestate.obj" - -@erase "$(INTDIR)\radio.obj" - -@erase "$(INTDIR)\radiostate.obj" - -@erase "$(INTDIR)\registrationbook.obj" - -@erase "$(INTDIR)\score.obj" - -@erase "$(INTDIR)\skateboard.obj" - -@erase "$(INTDIR)\towtrack.obj" - -@erase "$(INTDIR)\towtrackmissionstate.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase "$(OUTDIR)\LEGO1.exp" - -@erase "$(OUTDIR)\LEGO1.lib" - -@erase "$(OUTDIR)\LEGO1.pdb" - -@erase ".\Debug\LEGO1.DLL" - -@erase ".\Debug\LEGO1.ILK" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ - /Fp"$(INTDIR)/LEGO1.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\LEGO1\Debug/ -CPP_SBRS=.\. - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -MTL=mktyplib.exe -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/LEGO1.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug/LEGO1.DLL" -# SUBTRACT LINK32 /pdb:none /map -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ - odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /incremental:yes\ - /pdb:"$(OUTDIR)/LEGO1.pdb" /debug /machine:I386 /out:"Debug/LEGO1.DLL"\ - /implib:"$(OUTDIR)/LEGO1.lib" -LINK32_OBJS= \ - "$(INTDIR)\act1state.obj" \ - "$(INTDIR)\act2brick.obj" \ - "$(INTDIR)\act2policestation.obj" \ - "$(INTDIR)\act3.obj" \ - "$(INTDIR)\act3shark.obj" \ - "$(INTDIR)\act3state.obj" \ - "$(INTDIR)\ambulance.obj" \ - "$(INTDIR)\ambulancemissionstate.obj" \ - "$(INTDIR)\animstate.obj" \ - "$(INTDIR)\beachhouseentity.obj" \ - "$(INTDIR)\bike.obj" \ - "$(INTDIR)\buildingentity.obj" \ - "$(INTDIR)\bumpbouy.obj" \ - "$(INTDIR)\carrace.obj" \ - "$(INTDIR)\dllmain.obj" \ - "$(INTDIR)\dunebuggy.obj" \ - "$(INTDIR)\elevatorbottom.obj" \ - "$(INTDIR)\gasstation.obj" \ - "$(INTDIR)\gasstationentity.obj" \ - "$(INTDIR)\gasstationstate.obj" \ - "$(INTDIR)\helicopter.obj" \ - "$(INTDIR)\helicopterstate.obj" \ - "$(INTDIR)\historybook.obj" \ - "$(INTDIR)\hospital.obj" \ - "$(INTDIR)\hospitalentity.obj" \ - "$(INTDIR)\hospitalstate.obj" \ - "$(INTDIR)\infocenter.obj" \ - "$(INTDIR)\infocenterdoor.obj" \ - "$(INTDIR)\infocenterentity.obj" \ - "$(INTDIR)\infocenterstate.obj" \ - "$(INTDIR)\isle.obj" \ - "$(INTDIR)\isleactor.obj" \ - "$(INTDIR)\islepathactor.obj" \ - "$(INTDIR)\jetski.obj" \ - "$(INTDIR)\jetskiRace.obj" \ - "$(INTDIR)\jukebox.obj" \ - "$(INTDIR)\jukeboxentity.obj" \ - "$(INTDIR)\jukeboxstate.obj" \ - "$(INTDIR)\legoact2state.obj" \ - "$(INTDIR)\legoactioncontrolpresenter.obj" \ - "$(INTDIR)\legoanimactor.obj" \ - "$(INTDIR)\legoanimationmanager.obj" \ - "$(INTDIR)\legoanimmmpresenter.obj" \ - "$(INTDIR)\legoanimpresenter.obj" \ - "$(INTDIR)\legobuildingmanager.obj" \ - "$(INTDIR)\legocachesound.obj" \ - "$(INTDIR)\legocameracontroller.obj" \ - "$(INTDIR)\legocarbuild.obj" \ - "$(INTDIR)\legocarbuildanimpresenter.obj" \ - "$(INTDIR)\legocontrolmanager.obj" \ - "$(INTDIR)\legoentity.obj" \ - "$(INTDIR)\legoentitypresenter.obj" \ - "$(INTDIR)\legoflctexturepresenter.obj" \ - "$(INTDIR)\legohideanimpresenter.obj" \ - "$(INTDIR)\legoinputmanager.obj" \ - "$(INTDIR)\legojetski.obj" \ - "$(INTDIR)\legoloadcachesoundpresenter.obj" \ - "$(INTDIR)\legolocomotionanimpresenter.obj" \ - "$(INTDIR)\legonavcontroller.obj" \ - "$(INTDIR)\legoomni.obj" \ - "$(INTDIR)\legopalettepresenter.obj" \ - "$(INTDIR)\legopathactor.obj" \ - "$(INTDIR)\legopathcontroller.obj" \ - "$(INTDIR)\legopathpresenter.obj" \ - "$(INTDIR)\legophonemepresenter.obj" \ - "$(INTDIR)\legoplantmanager.obj" \ - "$(INTDIR)\legorace.obj" \ - "$(INTDIR)\legosoundmanager.obj" \ - "$(INTDIR)\legostate.obj" \ - "$(INTDIR)\legotexturepresenter.obj" \ - "$(INTDIR)\legovideomanager.obj" \ - "$(INTDIR)\legoworld.obj" \ - "$(INTDIR)\legoworldpresenter.obj" \ - "$(INTDIR)\motorcycle.obj" \ - "$(INTDIR)\mxatomid.obj" \ - "$(INTDIR)\mxaudiopresenter.obj" \ - "$(INTDIR)\mxautolocker.obj" \ - "$(INTDIR)\mxbackgroundaudiomanager.obj" \ - "$(INTDIR)\mxcompositemediapresenter.obj" \ - "$(INTDIR)\mxcompositepresenter.obj" \ - "$(INTDIR)\mxcontrolpresenter.obj" \ - "$(INTDIR)\mxcore.obj" \ - "$(INTDIR)\mxcriticalsection.obj" \ - "$(INTDIR)\mxdiskstreamcontroller.obj" \ - "$(INTDIR)\mxdiskstreamprovider.obj" \ - "$(INTDIR)\mxdsaction.obj" \ - "$(INTDIR)\mxdsanim.obj" \ - "$(INTDIR)\mxdschunk.obj" \ - "$(INTDIR)\mxdsevent.obj" \ - "$(INTDIR)\mxdsfile.obj" \ - "$(INTDIR)\mxdsmediaaction.obj" \ - "$(INTDIR)\mxdsmultiaction.obj" \ - "$(INTDIR)\mxdsobject.obj" \ - "$(INTDIR)\mxdsobjectaction.obj" \ - "$(INTDIR)\mxdsparallelaction.obj" \ - "$(INTDIR)\mxdsselectaction.obj" \ - "$(INTDIR)\mxdsserialaction.obj" \ - "$(INTDIR)\mxdssound.obj" \ - "$(INTDIR)\mxdssource.obj" \ - "$(INTDIR)\mxdsstill.obj" \ - "$(INTDIR)\mxdssubscriber.obj" \ - "$(INTDIR)\mxentity.obj" \ - "$(INTDIR)\mxeventmanager.obj" \ - "$(INTDIR)\mxeventpresenter.obj" \ - "$(INTDIR)\mxflcpresenter.obj" \ - "$(INTDIR)\mxioinfo.obj" \ - "$(INTDIR)\mxloopingflcpresenter.obj" \ - "$(INTDIR)\mxloopingsmkpresenter.obj" \ - "$(INTDIR)\mxmediapresenter.obj" \ - "$(INTDIR)\mxmusicpresenter.obj" \ - "$(INTDIR)\mxnotificationmanager.obj" \ - "$(INTDIR)\mxomni.obj" \ - "$(INTDIR)\mxomnicreateflags.obj" \ - "$(INTDIR)\mxomnicreateparam.obj" \ - "$(INTDIR)\mxomnicreateparambase.obj" \ - "$(INTDIR)\mxpalette.obj" \ - "$(INTDIR)\mxpresenter.obj" \ - "$(INTDIR)\mxsmkpresenter.obj" \ - "$(INTDIR)\mxsoundmanager.obj" \ - "$(INTDIR)\mxsoundpresenter.obj" \ - "$(INTDIR)\mxstillpresenter.obj" \ - "$(INTDIR)\mxstreamer.obj" \ - "$(INTDIR)\mxstring.obj" \ - "$(INTDIR)\mxtimer.obj" \ - "$(INTDIR)\mxtransitionmanager.obj" \ - "$(INTDIR)\mxunknown100dc6b0.obj" \ - "$(INTDIR)\mxvideomanager.obj" \ - "$(INTDIR)\mxvideoparam.obj" \ - "$(INTDIR)\mxvideoparamflags.obj" \ - "$(INTDIR)\mxvideopresenter.obj" \ - "$(INTDIR)\mxwavepresenter.obj" \ - "$(INTDIR)\pizza.obj" \ - "$(INTDIR)\pizzeria.obj" \ - "$(INTDIR)\pizzeriastate.obj" \ - "$(INTDIR)\police.obj" \ - "$(INTDIR)\policeentity.obj" \ - "$(INTDIR)\policestate.obj" \ - "$(INTDIR)\racecar.obj" \ - "$(INTDIR)\racestandsentity.obj" \ - "$(INTDIR)\racestate.obj" \ - "$(INTDIR)\radio.obj" \ - "$(INTDIR)\radiostate.obj" \ - "$(INTDIR)\registrationbook.obj" \ - "$(INTDIR)\score.obj" \ - "$(INTDIR)\skateboard.obj" \ - "$(INTDIR)\towtrack.obj" \ - "$(INTDIR)\towtrackmissionstate.obj" - -".\Debug\LEGO1.DLL" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "ISLE - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "ISLE\Release" -# PROP BASE Intermediate_Dir "ISLE\Release" -# PROP BASE Target_Dir "ISLE" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "ISLE\Release" -# PROP Intermediate_Dir "ISLE\Release" -# PROP Target_Dir "ISLE" -OUTDIR=.\ISLE\Release -INTDIR=.\ISLE\Release - -ALL : "LEGO1 - Win32 Release" ".\Release\ISLE.EXE" - -CLEAN : - -@erase "$(INTDIR)\define.obj" - -@erase "$(INTDIR)\isle.res" - -@erase "$(INTDIR)\isleapp.obj" - -@erase "$(INTDIR)\vc40.pdb" - -@erase ".\Release\ISLE.EXE" - -@erase ".\Release\ISLE.PDB" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /GX /Zi /O2 /I "LEGO1" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /ML /W3 /GX /Zi /O2 /I "LEGO1" /D "WIN32" /D "NDEBUG" /D\ - "_WINDOWS" /Fp"$(INTDIR)/ISLE.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\ISLE\Release/ -CPP_SBRS=.\. - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -MTL=mktyplib.exe -# ADD BASE MTL /nologo /D "NDEBUG" /win32 -# ADD MTL /nologo /D "NDEBUG" /win32 -MTL_PROJ=/nologo /D "NDEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -RSC_PROJ=/l 0x409 /fo"$(INTDIR)/isle.res" /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/ISLE.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib lego1.lib dsound.lib /nologo /subsystem:windows /pdb:"Release/ISLE.PDB" /debug /machine:I386 /out:"Release/ISLE.EXE" /LIBPATH:"ISLE/ext" -# SUBTRACT LINK32 /pdb:none -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ - odbccp32.lib winmm.lib lego1.lib dsound.lib /nologo /subsystem:windows\ - /incremental:no /pdb:"Release/ISLE.PDB" /debug /machine:I386\ - /out:"Release/ISLE.EXE" /LIBPATH:"ISLE/ext" -LINK32_OBJS= \ - "$(INTDIR)\define.obj" \ - "$(INTDIR)\isle.res" \ - "$(INTDIR)\isleapp.obj" \ - ".\Release\LEGO1.LIB" - -".\Release\ISLE.EXE" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "ISLE\Debug" -# PROP BASE Intermediate_Dir "ISLE\Debug" -# PROP BASE Target_Dir "ISLE" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "ISLE\Debug" -# PROP Intermediate_Dir "ISLE\Debug" -# PROP Target_Dir "ISLE" -OUTDIR=.\ISLE\Debug -INTDIR=.\ISLE\Debug - -ALL : "LEGO1 - Win32 Debug" ".\Debug\ISLE.EXE" - -CLEAN : - -@erase "$(INTDIR)\define.obj" - -@erase "$(INTDIR)\isle.res" - -@erase "$(INTDIR)\isleapp.obj" - -@erase "$(INTDIR)\vc40.idb" - -@erase "$(INTDIR)\vc40.pdb" - -@erase ".\Debug\ISLE.EXE" - -@erase ".\Debug\ISLE.ILK" - -@erase ".\Debug\ISLE.PDB" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "LEGO1" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "LEGO1" /D "WIN32" /D "_DEBUG" /D\ - "_WINDOWS" /Fp"$(INTDIR)/ISLE.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c -CPP_OBJS=.\ISLE\Debug/ -CPP_SBRS=.\. - -.c{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_OBJS)}.obj: - $(CPP) $(CPP_PROJ) $< - -.c{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cpp{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -.cxx{$(CPP_SBRS)}.sbr: - $(CPP) $(CPP_PROJ) $< - -MTL=mktyplib.exe -# ADD BASE MTL /nologo /D "_DEBUG" /win32 -# ADD MTL /nologo /D "_DEBUG" /win32 -MTL_PROJ=/nologo /D "_DEBUG" /win32 -RSC=rc.exe -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -RSC_PROJ=/l 0x409 /fo"$(INTDIR)/isle.res" /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -BSC32_FLAGS=/nologo /o"$(OUTDIR)/ISLE.bsc" -BSC32_SBRS= \ - -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib lego1.lib dsound.lib /nologo /subsystem:windows /pdb:"Debug/ISLE.PDB" /debug /machine:I386 /out:"Debug/ISLE.EXE" /LIBPATH:"ISLE/ext" -# SUBTRACT LINK32 /pdb:none -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ - advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ - odbccp32.lib winmm.lib lego1.lib dsound.lib /nologo /subsystem:windows\ - /incremental:yes /pdb:"Debug/ISLE.PDB" /debug /machine:I386\ - /out:"Debug/ISLE.EXE" /LIBPATH:"ISLE/ext" -LINK32_OBJS= \ - "$(INTDIR)\define.obj" \ - "$(INTDIR)\isle.res" \ - "$(INTDIR)\isleapp.obj" \ - ".\LEGO1\Debug\LEGO1.lib" - -".\Debug\ISLE.EXE" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) - $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) -<< - -!ENDIF - -################################################################################ -# Begin Target - -# Name "LEGO1 - Win32 Release" -# Name "LEGO1 - Win32 Debug" - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxcore.cpp -DEP_CPP_MXCOR=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxcore.obj" : $(SOURCE) $(DEP_CPP_MXCOR) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\dllmain.cpp - -"$(INTDIR)\dllmain.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoomni.cpp -DEP_CPP_LEGOO=\ - ".\LEGO1\isle.h"\ - ".\LEGO1\lego3dmanager.h"\ - ".\LEGO1\lego3dview.h"\ - ".\LEGO1\legobuildingmanager.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legogamestate.h"\ - ".\LEGO1\legoinputmanager.h"\ - ".\LEGO1\legonavcontroller.h"\ - ".\LEGO1\legoomni.h"\ - ".\LEGO1\legoplantmanager.h"\ - ".\LEGO1\legoroi.h"\ - ".\LEGO1\legovideomanager.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxbackgroundaudiomanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsfile.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdssource.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxeventmanager.h"\ - ".\LEGO1\mxioinfo.h"\ - ".\LEGO1\mxmusicmanager.h"\ - ".\LEGO1\mxnotificationmanager.h"\ - ".\LEGO1\mxobjectfactory.h"\ - ".\LEGO1\mxomni.h"\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxomnicreateparam.h"\ - ".\LEGO1\mxomnicreateparambase.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxsoundmanager.h"\ - ".\LEGO1\mxstreamcontroller.h"\ - ".\LEGO1\mxstreamer.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxticklemanager.h"\ - ".\LEGO1\mxtimer.h"\ - ".\LEGO1\mxtransitionmanager.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - ".\LEGO1\viewmanager.h"\ - - -"$(INTDIR)\legoomni.obj" : $(SOURCE) $(DEP_CPP_LEGOO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxcriticalsection.cpp -DEP_CPP_MXCRI=\ - ".\LEGO1\mxcriticalsection.h"\ - - -"$(INTDIR)\mxcriticalsection.obj" : $(SOURCE) $(DEP_CPP_MXCRI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxautolocker.cpp -DEP_CPP_MXAUT=\ - ".\LEGO1\mxautolocker.h"\ - ".\LEGO1\mxcriticalsection.h"\ - - -"$(INTDIR)\mxautolocker.obj" : $(SOURCE) $(DEP_CPP_MXAUT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxtimer.cpp -DEP_CPP_MXTIM=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtimer.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxtimer.obj" : $(SOURCE) $(DEP_CPP_MXTIM) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxomni.cpp -DEP_CPP_MXOMN=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxeventmanager.h"\ - ".\LEGO1\mxmusicmanager.h"\ - ".\LEGO1\mxnotificationmanager.h"\ - ".\LEGO1\mxobjectfactory.h"\ - ".\LEGO1\mxomni.h"\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxomnicreateparam.h"\ - ".\LEGO1\mxomnicreateparambase.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxsoundmanager.h"\ - ".\LEGO1\mxstreamcontroller.h"\ - ".\LEGO1\mxstreamer.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxticklemanager.h"\ - ".\LEGO1\mxtimer.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - - -"$(INTDIR)\mxomni.obj" : $(SOURCE) $(DEP_CPP_MXOMN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxvideoparam.cpp -DEP_CPP_MXVID=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - - -"$(INTDIR)\mxvideoparam.obj" : $(SOURCE) $(DEP_CPP_MXVID) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxvideoparamflags.cpp -DEP_CPP_MXVIDE=\ - ".\LEGO1\mxvideoparamflags.h"\ - - -"$(INTDIR)\mxvideoparamflags.obj" : $(SOURCE) $(DEP_CPP_MXVIDE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxomnicreateparam.cpp -DEP_CPP_MXOMNI=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxomnicreateparam.h"\ - ".\LEGO1\mxomnicreateparambase.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - - -"$(INTDIR)\mxomnicreateparam.obj" : $(SOURCE) $(DEP_CPP_MXOMNI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxomnicreateparambase.cpp -DEP_CPP_MXOMNIC=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxomnicreateparam.h"\ - ".\LEGO1\mxomnicreateparambase.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - - -"$(INTDIR)\mxomnicreateparambase.obj" : $(SOURCE) $(DEP_CPP_MXOMNIC)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxstring.cpp -DEP_CPP_MXSTR=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxstring.obj" : $(SOURCE) $(DEP_CPP_MXSTR) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxomnicreateflags.cpp -DEP_CPP_MXOMNICR=\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxomnicreateflags.obj" : $(SOURCE) $(DEP_CPP_MXOMNICR) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legonavcontroller.cpp -DEP_CPP_LEGON=\ - ".\LEGO1\isle.h"\ - ".\LEGO1\lego3dmanager.h"\ - ".\LEGO1\lego3dview.h"\ - ".\LEGO1\legobuildingmanager.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legogamestate.h"\ - ".\LEGO1\legoinputmanager.h"\ - ".\LEGO1\legonavcontroller.h"\ - ".\LEGO1\legoomni.h"\ - ".\LEGO1\legoplantmanager.h"\ - ".\LEGO1\legoroi.h"\ - ".\LEGO1\legoutil.h"\ - ".\LEGO1\legovideomanager.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxbackgroundaudiomanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsfile.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdssource.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxeventmanager.h"\ - ".\LEGO1\mxioinfo.h"\ - ".\LEGO1\mxmusicmanager.h"\ - ".\LEGO1\mxnotificationmanager.h"\ - ".\LEGO1\mxobjectfactory.h"\ - ".\LEGO1\mxomni.h"\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxomnicreateparam.h"\ - ".\LEGO1\mxomnicreateparambase.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxsoundmanager.h"\ - ".\LEGO1\mxstreamcontroller.h"\ - ".\LEGO1\mxstreamer.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxticklemanager.h"\ - ".\LEGO1\mxtimer.h"\ - ".\LEGO1\mxtransitionmanager.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - ".\LEGO1\viewmanager.h"\ - - -"$(INTDIR)\legonavcontroller.obj" : $(SOURCE) $(DEP_CPP_LEGON) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsobject.cpp -DEP_CPP_MXDSO=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsobject.obj" : $(SOURCE) $(DEP_CPP_MXDSO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxatomid.cpp -DEP_CPP_MXATO=\ - ".\LEGO1\mxatomid.h"\ - - -"$(INTDIR)\mxatomid.obj" : $(SOURCE) $(DEP_CPP_MXATO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxunknown100dc6b0.cpp -DEP_CPP_MXUNK=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - - -"$(INTDIR)\mxunknown100dc6b0.obj" : $(SOURCE) $(DEP_CPP_MXUNK) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxvideomanager.cpp -DEP_CPP_MXVIDEO=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - - -"$(INTDIR)\mxvideomanager.obj" : $(SOURCE) $(DEP_CPP_MXVIDEO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxpalette.cpp -DEP_CPP_MXPAL=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxpalette.obj" : $(SOURCE) $(DEP_CPP_MXPAL) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\act1state.cpp -DEP_CPP_ACT1S=\ - ".\LEGO1\act1state.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\act1state.obj" : $(SOURCE) $(DEP_CPP_ACT1S) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\act2brick.cpp -DEP_CPP_ACT2B=\ - ".\LEGO1\act2brick.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\act2brick.obj" : $(SOURCE) $(DEP_CPP_ACT2B) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\act2policestation.cpp -DEP_CPP_ACT2P=\ - ".\LEGO1\act2policestation.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\act2policestation.obj" : $(SOURCE) $(DEP_CPP_ACT2P) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\act3.cpp -DEP_CPP_ACT3_=\ - ".\LEGO1\act3.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\act3.obj" : $(SOURCE) $(DEP_CPP_ACT3_) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\act3shark.cpp -DEP_CPP_ACT3S=\ - ".\LEGO1\act3shark.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoanimactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\act3shark.obj" : $(SOURCE) $(DEP_CPP_ACT3S) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\ambulance.cpp -DEP_CPP_AMBUL=\ - ".\LEGO1\ambulance.h"\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\ambulance.obj" : $(SOURCE) $(DEP_CPP_AMBUL) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\ambulancemissionstate.cpp -DEP_CPP_AMBULA=\ - ".\LEGO1\ambulancemissionstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\ambulancemissionstate.obj" : $(SOURCE) $(DEP_CPP_AMBULA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\animstate.cpp -DEP_CPP_ANIMS=\ - ".\LEGO1\animstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\animstate.obj" : $(SOURCE) $(DEP_CPP_ANIMS) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\beachhouseentity.cpp -DEP_CPP_BEACH=\ - ".\LEGO1\beachhouseentity.h"\ - ".\LEGO1\buildingentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\beachhouseentity.obj" : $(SOURCE) $(DEP_CPP_BEACH) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\bike.cpp -DEP_CPP_BIKE_=\ - ".\LEGO1\bike.h"\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\bike.obj" : $(SOURCE) $(DEP_CPP_BIKE_) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\buildingentity.cpp -DEP_CPP_BUILD=\ - ".\LEGO1\buildingentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\buildingentity.obj" : $(SOURCE) $(DEP_CPP_BUILD) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\bumpbouy.cpp -DEP_CPP_BUMPB=\ - ".\LEGO1\bumpbouy.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoanimactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\bumpbouy.obj" : $(SOURCE) $(DEP_CPP_BUMPB) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\carrace.cpp -DEP_CPP_CARRA=\ - ".\LEGO1\carrace.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legorace.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\carrace.obj" : $(SOURCE) $(DEP_CPP_CARRA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\dunebuggy.cpp -DEP_CPP_DUNEB=\ - ".\LEGO1\dunebuggy.h"\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\dunebuggy.obj" : $(SOURCE) $(DEP_CPP_DUNEB) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\elevatorbottom.cpp -DEP_CPP_ELEVA=\ - ".\LEGO1\elevatorbottom.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\elevatorbottom.obj" : $(SOURCE) $(DEP_CPP_ELEVA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\gasstation.cpp -DEP_CPP_GASST=\ - ".\LEGO1\gasstation.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\gasstation.obj" : $(SOURCE) $(DEP_CPP_GASST) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\gasstationentity.cpp -DEP_CPP_GASSTA=\ - ".\LEGO1\buildingentity.h"\ - ".\LEGO1\gasstationentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\gasstationentity.obj" : $(SOURCE) $(DEP_CPP_GASSTA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\gasstationstate.cpp -DEP_CPP_GASSTAT=\ - ".\LEGO1\gasstationstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\gasstationstate.obj" : $(SOURCE) $(DEP_CPP_GASSTAT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\helicopter.cpp -DEP_CPP_HELIC=\ - ".\LEGO1\helicopter.h"\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\helicopter.obj" : $(SOURCE) $(DEP_CPP_HELIC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\historybook.cpp -DEP_CPP_HISTO=\ - ".\LEGO1\historybook.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\historybook.obj" : $(SOURCE) $(DEP_CPP_HISTO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\hospital.cpp -DEP_CPP_HOSPI=\ - ".\LEGO1\hospital.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\hospital.obj" : $(SOURCE) $(DEP_CPP_HOSPI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\hospitalentity.cpp -DEP_CPP_HOSPIT=\ - ".\LEGO1\buildingentity.h"\ - ".\LEGO1\hospitalentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\hospitalentity.obj" : $(SOURCE) $(DEP_CPP_HOSPIT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\hospitalstate.cpp -DEP_CPP_HOSPITA=\ - ".\LEGO1\hospitalstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\hospitalstate.obj" : $(SOURCE) $(DEP_CPP_HOSPITA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\infocenter.cpp -DEP_CPP_INFOC=\ - ".\LEGO1\infocenter.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\infocenter.obj" : $(SOURCE) $(DEP_CPP_INFOC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\infocenterdoor.cpp -DEP_CPP_INFOCE=\ - ".\LEGO1\infocenterdoor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\infocenterdoor.obj" : $(SOURCE) $(DEP_CPP_INFOCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\infocenterentity.cpp -DEP_CPP_INFOCEN=\ - ".\LEGO1\buildingentity.h"\ - ".\LEGO1\infocenterentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\infocenterentity.obj" : $(SOURCE) $(DEP_CPP_INFOCEN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\infocenterstate.cpp -DEP_CPP_INFOCENT=\ - ".\LEGO1\infocenterstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\infocenterstate.obj" : $(SOURCE) $(DEP_CPP_INFOCENT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\isle.cpp -DEP_CPP_ISLE_=\ - ".\LEGO1\isle.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\isle.obj" : $(SOURCE) $(DEP_CPP_ISLE_) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\isleactor.cpp -DEP_CPP_ISLEA=\ - ".\LEGO1\isleactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\isleactor.obj" : $(SOURCE) $(DEP_CPP_ISLEA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\islepathactor.cpp -DEP_CPP_ISLEP=\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\islepathactor.obj" : $(SOURCE) $(DEP_CPP_ISLEP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\jetski.cpp -DEP_CPP_JETSK=\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\jetski.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\jetski.obj" : $(SOURCE) $(DEP_CPP_JETSK) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\jetskiRace.cpp -DEP_CPP_JETSKI=\ - ".\LEGO1\jetskiRace.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legorace.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\jetskiRace.obj" : $(SOURCE) $(DEP_CPP_JETSKI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\jukebox.cpp -DEP_CPP_JUKEB=\ - ".\LEGO1\jukebox.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\jukebox.obj" : $(SOURCE) $(DEP_CPP_JUKEB) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\jukeboxentity.cpp -DEP_CPP_JUKEBO=\ - ".\LEGO1\jukeboxentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\jukeboxentity.obj" : $(SOURCE) $(DEP_CPP_JUKEBO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoactioncontrolpresenter.cpp -DEP_CPP_LEGOA=\ - ".\LEGO1\legoactioncontrolpresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoactioncontrolpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOA)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoanimactor.cpp -DEP_CPP_LEGOAN=\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoanimactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoanimactor.obj" : $(SOURCE) $(DEP_CPP_LEGOAN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoanimationmanager.cpp -DEP_CPP_LEGOANI=\ - ".\LEGO1\legoanimationmanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoanimationmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOANI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoanimmmpresenter.cpp -DEP_CPP_LEGOANIM=\ - ".\LEGO1\legoanimmmpresenter.h"\ - ".\LEGO1\mxcompositepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoanimmmpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOANIM) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoanimpresenter.cpp -DEP_CPP_LEGOANIMP=\ - ".\LEGO1\legoanimpresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\legoanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOANIMP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legobuildingmanager.cpp -DEP_CPP_LEGOB=\ - ".\LEGO1\legobuildingmanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legobuildingmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOB) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legocachesound.cpp -DEP_CPP_LEGOC=\ - ".\LEGO1\legocachesound.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legocachesound.obj" : $(SOURCE) $(DEP_CPP_LEGOC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legocameracontroller.cpp -DEP_CPP_LEGOCA=\ - ".\LEGO1\legocameracontroller.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legocameracontroller.obj" : $(SOURCE) $(DEP_CPP_LEGOCA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legocarbuild.cpp -DEP_CPP_LEGOCAR=\ - ".\LEGO1\legocarbuild.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legocarbuild.obj" : $(SOURCE) $(DEP_CPP_LEGOCAR) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legocarbuildanimpresenter.cpp -DEP_CPP_LEGOCARB=\ - ".\LEGO1\legoanimpresenter.h"\ - ".\LEGO1\legocarbuildanimpresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\legocarbuildanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOCARB)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legocontrolmanager.cpp -DEP_CPP_LEGOCO=\ - ".\LEGO1\legocontrolmanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legocontrolmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOCO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoentity.cpp -DEP_CPP_LEGOE=\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoentity.obj" : $(SOURCE) $(DEP_CPP_LEGOE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoentitypresenter.cpp -DEP_CPP_LEGOEN=\ - ".\LEGO1\legoentitypresenter.h"\ - ".\LEGO1\mxcompositepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoentitypresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOEN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoflctexturepresenter.cpp -DEP_CPP_LEGOF=\ - ".\LEGO1\legoflctexturepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxflcpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\legoflctexturepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOF)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legohideanimpresenter.cpp -DEP_CPP_LEGOH=\ - ".\LEGO1\legoanimpresenter.h"\ - ".\LEGO1\legohideanimpresenter.h"\ - ".\LEGO1\legoloopinganimpresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\legohideanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOH) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoinputmanager.cpp -DEP_CPP_LEGOI=\ - ".\LEGO1\legoinputmanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoinputmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legojetski.cpp -DEP_CPP_LEGOJ=\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoanimactor.h"\ - ".\LEGO1\legocarraceactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legojetski.h"\ - ".\LEGO1\legojetskiraceactor.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\legoraceactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legojetski.obj" : $(SOURCE) $(DEP_CPP_LEGOJ) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoloadcachesoundpresenter.cpp -DEP_CPP_LEGOL=\ - ".\LEGO1\legoloadcachesoundpresenter.h"\ - ".\LEGO1\mxaudiopresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxsoundpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxwavepresenter.h"\ - - -"$(INTDIR)\legoloadcachesoundpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOL)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legolocomotionanimpresenter.cpp -DEP_CPP_LEGOLO=\ - ".\LEGO1\legoanimpresenter.h"\ - ".\LEGO1\legolocomotionanimpresenter.h"\ - ".\LEGO1\legoloopinganimpresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\legolocomotionanimpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOLO)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legopalettepresenter.cpp -DEP_CPP_LEGOP=\ - ".\LEGO1\legopalettepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\legopalettepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legopathactor.cpp -DEP_CPP_LEGOPA=\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legopathactor.obj" : $(SOURCE) $(DEP_CPP_LEGOPA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legopathpresenter.cpp -DEP_CPP_LEGOPAT=\ - ".\LEGO1\legopathpresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legopathpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOPAT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legophonemepresenter.cpp -DEP_CPP_LEGOPH=\ - ".\LEGO1\legophonemepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxflcpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\legophonemepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOPH) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoplantmanager.cpp -DEP_CPP_LEGOPL=\ - ".\LEGO1\legoplantmanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoplantmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOPL) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legorace.cpp -DEP_CPP_LEGOR=\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legorace.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legorace.obj" : $(SOURCE) $(DEP_CPP_LEGOR) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legosoundmanager.cpp -DEP_CPP_LEGOS=\ - ".\LEGO1\legosoundmanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxsoundmanager.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legosoundmanager.obj" : $(SOURCE) $(DEP_CPP_LEGOS) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legotexturepresenter.cpp -DEP_CPP_LEGOT=\ - ".\LEGO1\legotexturepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legotexturepresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoworld.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_LEGOW=\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoworld.obj" : $(SOURCE) $(DEP_CPP_LEGOW) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_LEGOW=\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoworld.obj" : $(SOURCE) $(DEP_CPP_LEGOW) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoworldpresenter.cpp -DEP_CPP_LEGOWO=\ - ".\LEGO1\legoentitypresenter.h"\ - ".\LEGO1\legoworldpresenter.h"\ - ".\LEGO1\mxcompositepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoworldpresenter.obj" : $(SOURCE) $(DEP_CPP_LEGOWO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\motorcycle.cpp -DEP_CPP_MOTOR=\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\motorcycle.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\motorcycle.obj" : $(SOURCE) $(DEP_CPP_MOTOR) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxcontrolpresenter.cpp -DEP_CPP_MXCON=\ - ".\LEGO1\mxcompositepresenter.h"\ - ".\LEGO1\mxcontrolpresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxcontrolpresenter.obj" : $(SOURCE) $(DEP_CPP_MXCON) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdiskstreamcontroller.cpp -DEP_CPP_MXDIS=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdiskstreamcontroller.h"\ - ".\LEGO1\mxstreamcontroller.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdiskstreamcontroller.obj" : $(SOURCE) $(DEP_CPP_MXDIS) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdschunk.cpp -DEP_CPP_MXDSC=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdschunk.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdschunk.obj" : $(SOURCE) $(DEP_CPP_MXDSC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsfile.cpp -DEP_CPP_MXDSF=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsfile.h"\ - ".\LEGO1\mxdssource.h"\ - ".\LEGO1\mxioinfo.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsfile.obj" : $(SOURCE) $(DEP_CPP_MXDSF) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxentity.cpp -DEP_CPP_MXENT=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxentity.obj" : $(SOURCE) $(DEP_CPP_MXENT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxeventmanager.cpp -DEP_CPP_MXEVE=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxeventmanager.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - - -"$(INTDIR)\mxeventmanager.obj" : $(SOURCE) $(DEP_CPP_MXEVE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxeventpresenter.cpp -DEP_CPP_MXEVEN=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxeventpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxeventpresenter.obj" : $(SOURCE) $(DEP_CPP_MXEVEN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxflcpresenter.cpp -DEP_CPP_MXFLC=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxflcpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxflcpresenter.obj" : $(SOURCE) $(DEP_CPP_MXFLC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxloopingsmkpresenter.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXLOO=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxloopingsmkpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxsmkpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxloopingsmkpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXLOO=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxloopingsmkpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxsmkpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxloopingsmkpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxmediapresenter.cpp -DEP_CPP_MXMED=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxmediapresenter.obj" : $(SOURCE) $(DEP_CPP_MXMED) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxmusicpresenter.cpp -DEP_CPP_MXMUS=\ - ".\LEGO1\mxaudiopresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxmusicpresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxmusicpresenter.obj" : $(SOURCE) $(DEP_CPP_MXMUS) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxnotificationmanager.cpp -DEP_CPP_MXNOT=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxnotificationmanager.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxnotificationmanager.obj" : $(SOURCE) $(DEP_CPP_MXNOT) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxpresenter.cpp -DEP_CPP_MXPRE=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxpresenter.obj" : $(SOURCE) $(DEP_CPP_MXPRE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxsmkpresenter.cpp -DEP_CPP_MXSMK=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxsmkpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxsmkpresenter.obj" : $(SOURCE) $(DEP_CPP_MXSMK) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxsoundmanager.cpp -DEP_CPP_MXSOU=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxsoundmanager.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxsoundmanager.obj" : $(SOURCE) $(DEP_CPP_MXSOU) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxstillpresenter.cpp -DEP_CPP_MXSTI=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxstillpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxstillpresenter.obj" : $(SOURCE) $(DEP_CPP_MXSTI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxstreamer.cpp -DEP_CPP_MXSTRE=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxstreamcontroller.h"\ - ".\LEGO1\mxstreamer.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxstreamer.obj" : $(SOURCE) $(DEP_CPP_MXSTRE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxtransitionmanager.cpp -DEP_CPP_MXTRA=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtransitionmanager.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxtransitionmanager.obj" : $(SOURCE) $(DEP_CPP_MXTRA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxvideopresenter.cpp -DEP_CPP_MXVIDEOP=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxvideopresenter.obj" : $(SOURCE) $(DEP_CPP_MXVIDEOP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxwavepresenter.cpp -DEP_CPP_MXWAV=\ - ".\LEGO1\mxaudiopresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxsoundpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxwavepresenter.h"\ - - -"$(INTDIR)\mxwavepresenter.obj" : $(SOURCE) $(DEP_CPP_MXWAV) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\pizza.cpp -DEP_CPP_PIZZA=\ - ".\LEGO1\isleactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\pizza.h"\ - - -"$(INTDIR)\pizza.obj" : $(SOURCE) $(DEP_CPP_PIZZA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\pizzeria.cpp -DEP_CPP_PIZZE=\ - ".\LEGO1\isleactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\pizzeria.h"\ - - -"$(INTDIR)\pizzeria.obj" : $(SOURCE) $(DEP_CPP_PIZZE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\pizzeriastate.cpp -DEP_CPP_PIZZER=\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\pizzeriastate.h"\ - - -"$(INTDIR)\pizzeriastate.obj" : $(SOURCE) $(DEP_CPP_PIZZER) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\police.cpp -DEP_CPP_POLIC=\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\police.h"\ - - -"$(INTDIR)\police.obj" : $(SOURCE) $(DEP_CPP_POLIC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\policeentity.cpp -DEP_CPP_POLICE=\ - ".\LEGO1\buildingentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\policeentity.h"\ - - -"$(INTDIR)\policeentity.obj" : $(SOURCE) $(DEP_CPP_POLICE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\policestate.cpp -DEP_CPP_POLICES=\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\policestate.h"\ - - -"$(INTDIR)\policestate.obj" : $(SOURCE) $(DEP_CPP_POLICES) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\racecar.cpp -DEP_CPP_RACEC=\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\racecar.h"\ - - -"$(INTDIR)\racecar.obj" : $(SOURCE) $(DEP_CPP_RACEC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\racestandsentity.cpp -DEP_CPP_RACES=\ - ".\LEGO1\buildingentity.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\racestandsentity.h"\ - - -"$(INTDIR)\racestandsentity.obj" : $(SOURCE) $(DEP_CPP_RACES) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\racestate.cpp -DEP_CPP_RACEST=\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\racestate.h"\ - - -"$(INTDIR)\racestate.obj" : $(SOURCE) $(DEP_CPP_RACEST) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\radio.cpp -DEP_CPP_RADIO=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\radio.h"\ - - -"$(INTDIR)\radio.obj" : $(SOURCE) $(DEP_CPP_RADIO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\radiostate.cpp -DEP_CPP_RADIOS=\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\radiostate.h"\ - - -"$(INTDIR)\radiostate.obj" : $(SOURCE) $(DEP_CPP_RADIOS) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\registrationbook.cpp -DEP_CPP_REGIS=\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\registrationbook.h"\ - - -"$(INTDIR)\registrationbook.obj" : $(SOURCE) $(DEP_CPP_REGIS) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\score.cpp -DEP_CPP_SCORE=\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\score.h"\ - - -"$(INTDIR)\score.obj" : $(SOURCE) $(DEP_CPP_SCORE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\skateboard.cpp -DEP_CPP_SKATE=\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\skateboard.h"\ - - -"$(INTDIR)\skateboard.obj" : $(SOURCE) $(DEP_CPP_SKATE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\towtrack.cpp -DEP_CPP_TOWTR=\ - ".\LEGO1\islepathactor.h"\ - ".\LEGO1\legoactor.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legopathactor.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\towtrack.h"\ - - -"$(INTDIR)\towtrack.obj" : $(SOURCE) $(DEP_CPP_TOWTR) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\towtrackmissionstate.cpp -DEP_CPP_TOWTRA=\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\towtrackmissionstate.h"\ - - -"$(INTDIR)\towtrackmissionstate.obj" : $(SOURCE) $(DEP_CPP_TOWTRA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxcompositemediapresenter.cpp -DEP_CPP_MXCOM=\ - ".\LEGO1\mxcompositemediapresenter.h"\ - ".\LEGO1\mxcompositepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxcompositemediapresenter.obj" : $(SOURCE) $(DEP_CPP_MXCOM)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxcompositepresenter.cpp -DEP_CPP_MXCOMP=\ - ".\LEGO1\mxcompositepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxcompositepresenter.obj" : $(SOURCE) $(DEP_CPP_MXCOMP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legostate.cpp -DEP_CPP_LEGOST=\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legostate.obj" : $(SOURCE) $(DEP_CPP_LEGOST) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxaudiopresenter.cpp -DEP_CPP_MXAUD=\ - ".\LEGO1\mxaudiopresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxaudiopresenter.obj" : $(SOURCE) $(DEP_CPP_MXAUD) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxsoundpresenter.cpp -DEP_CPP_MXSOUN=\ - ".\LEGO1\mxaudiopresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxsoundpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxsoundpresenter.obj" : $(SOURCE) $(DEP_CPP_MXSOUN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxioinfo.cpp -DEP_CPP_MXIOI=\ - ".\LEGO1\mxioinfo.h"\ - - -"$(INTDIR)\mxioinfo.obj" : $(SOURCE) $(DEP_CPP_MXIOI) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdssource.cpp -DEP_CPP_MXDSS=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdssource.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdssource.obj" : $(SOURCE) $(DEP_CPP_MXDSS) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\act3state.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_ACT3ST=\ - ".\LEGO1\act3state.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\act3state.obj" : $(SOURCE) $(DEP_CPP_ACT3ST) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_ACT3ST=\ - ".\LEGO1\act3state.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\act3state.obj" : $(SOURCE) $(DEP_CPP_ACT3ST) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\helicopterstate.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_HELICO=\ - ".\LEGO1\helicopterstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\helicopterstate.obj" : $(SOURCE) $(DEP_CPP_HELICO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_HELICO=\ - ".\LEGO1\helicopterstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\helicopterstate.obj" : $(SOURCE) $(DEP_CPP_HELICO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\jukeboxstate.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_JUKEBOX=\ - ".\LEGO1\jukeboxstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\jukeboxstate.obj" : $(SOURCE) $(DEP_CPP_JUKEBOX) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_JUKEBOX=\ - ".\LEGO1\jukeboxstate.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\jukeboxstate.obj" : $(SOURCE) $(DEP_CPP_JUKEBOX) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoact2state.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_LEGOAC=\ - ".\LEGO1\legoact2state.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoact2state.obj" : $(SOURCE) $(DEP_CPP_LEGOAC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_LEGOAC=\ - ".\LEGO1\legoact2state.h"\ - ".\LEGO1\legostate.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legoact2state.obj" : $(SOURCE) $(DEP_CPP_LEGOAC) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legopathcontroller.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_LEGOPATH=\ - ".\LEGO1\legopathcontroller.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legopathcontroller.obj" : $(SOURCE) $(DEP_CPP_LEGOPATH) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_LEGOPATH=\ - ".\LEGO1\legopathcontroller.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\legopathcontroller.obj" : $(SOURCE) $(DEP_CPP_LEGOPATH) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legovideomanager.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_LEGOV=\ - ".\LEGO1\lego3dmanager.h"\ - ".\LEGO1\lego3dview.h"\ - ".\LEGO1\legovideomanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - ".\LEGO1\viewmanager.h"\ - - -"$(INTDIR)\legovideomanager.obj" : $(SOURCE) $(DEP_CPP_LEGOV) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_LEGOV=\ - ".\LEGO1\lego3dmanager.h"\ - ".\LEGO1\lego3dview.h"\ - ".\LEGO1\legovideomanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - ".\LEGO1\viewmanager.h"\ - - -"$(INTDIR)\legovideomanager.obj" : $(SOURCE) $(DEP_CPP_LEGOV) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxbackgroundaudiomanager.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXBAC=\ - ".\LEGO1\mxbackgroundaudiomanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxbackgroundaudiomanager.obj" : $(SOURCE) $(DEP_CPP_MXBAC)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXBAC=\ - ".\LEGO1\mxbackgroundaudiomanager.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxbackgroundaudiomanager.obj" : $(SOURCE) $(DEP_CPP_MXBAC)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdiskstreamprovider.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDISK=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdiskstreamprovider.h"\ - ".\LEGO1\mxstreamprovider.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdiskstreamprovider.obj" : $(SOURCE) $(DEP_CPP_MXDISK) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDISK=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdiskstreamprovider.h"\ - ".\LEGO1\mxstreamprovider.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdiskstreamprovider.obj" : $(SOURCE) $(DEP_CPP_MXDISK) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsaction.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSA=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsaction.obj" : $(SOURCE) $(DEP_CPP_MXDSA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSA=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsaction.obj" : $(SOURCE) $(DEP_CPP_MXDSA) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsanim.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSAN=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsanim.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsanim.obj" : $(SOURCE) $(DEP_CPP_MXDSAN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSAN=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsanim.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsanim.obj" : $(SOURCE) $(DEP_CPP_MXDSAN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsevent.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSE=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsevent.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsevent.obj" : $(SOURCE) $(DEP_CPP_MXDSE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSE=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsevent.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsevent.obj" : $(SOURCE) $(DEP_CPP_MXDSE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsmediaaction.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSM=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsmediaaction.obj" : $(SOURCE) $(DEP_CPP_MXDSM) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSM=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsmediaaction.obj" : $(SOURCE) $(DEP_CPP_MXDSM) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsmultiaction.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSMU=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsmultiaction.obj" : $(SOURCE) $(DEP_CPP_MXDSMU) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSMU=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsmultiaction.obj" : $(SOURCE) $(DEP_CPP_MXDSMU) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsobjectaction.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSOB=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsobjectaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsobjectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSOB) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSOB=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsobjectaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsobjectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSOB) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsparallelaction.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSP=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsparallelaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsparallelaction.obj" : $(SOURCE) $(DEP_CPP_MXDSP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSP=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsparallelaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsparallelaction.obj" : $(SOURCE) $(DEP_CPP_MXDSP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsselectaction.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSSE=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsparallelaction.h"\ - ".\LEGO1\mxdsselectaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsselectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSSE=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsparallelaction.h"\ - ".\LEGO1\mxdsselectaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsselectaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsserialaction.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSSER=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsserialaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsserialaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSER) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSSER=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmultiaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsserialaction.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsserialaction.obj" : $(SOURCE) $(DEP_CPP_MXDSSER) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdssound.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSSO=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdssound.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdssound.obj" : $(SOURCE) $(DEP_CPP_MXDSSO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSSO=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdssound.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdssound.obj" : $(SOURCE) $(DEP_CPP_MXDSSO) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsstill.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSST=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsstill.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsstill.obj" : $(SOURCE) $(DEP_CPP_MXDSST) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSST=\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsmediaaction.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdsstill.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdsstill.obj" : $(SOURCE) $(DEP_CPP_MXDSST) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdssubscriber.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXDSSU=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdssubscriber.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdssubscriber.obj" : $(SOURCE) $(DEP_CPP_MXDSSU) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXDSSU=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxdssubscriber.h"\ - ".\LEGO1\mxtypes.h"\ - - -"$(INTDIR)\mxdssubscriber.obj" : $(SOURCE) $(DEP_CPP_MXDSSU) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxloopingflcpresenter.cpp - -!IF "$(CFG)" == "LEGO1 - Win32 Release" - -DEP_CPP_MXLOOP=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxflcpresenter.h"\ - ".\LEGO1\mxloopingflcpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxloopingflcpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOOP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "LEGO1 - Win32 Debug" - -DEP_CPP_MXLOOP=\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxflcpresenter.h"\ - ".\LEGO1\mxloopingflcpresenter.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxvideopresenter.h"\ - - -"$(INTDIR)\mxloopingflcpresenter.obj" : $(SOURCE) $(DEP_CPP_MXLOOP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - -# End Source File -# End Target -################################################################################ -# Begin Target - -# Name "ISLE - Win32 Release" -# Name "ISLE - Win32 Debug" - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -################################################################################ -# Begin Source File - -SOURCE=.\ISLE\define.cpp -DEP_CPP_DEFIN=\ - ".\ISLE\define.h"\ - - -"$(INTDIR)\define.obj" : $(SOURCE) $(DEP_CPP_DEFIN) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\ISLE\res\isle.rc -DEP_RSC_ISLE_R=\ - ".\ISLE\res\resource.h"\ - - -!IF "$(CFG)" == "ISLE - Win32 Release" - - -"$(INTDIR)\isle.res" : $(SOURCE) $(DEP_RSC_ISLE_R) "$(INTDIR)" - $(RSC) /l 0x409 /fo"$(INTDIR)/isle.res" /i "ISLE\res" /d "NDEBUG" $(SOURCE) - - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - - -"$(INTDIR)\isle.res" : $(SOURCE) $(DEP_RSC_ISLE_R) "$(INTDIR)" - $(RSC) /l 0x409 /fo"$(INTDIR)/isle.res" /i "ISLE\res" /d "_DEBUG" $(SOURCE) - - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoanimationmanager.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legobuildingmanager.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legogamestate.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoinputmanager.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legomodelpresenter.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoomni.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legopartpresenter.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoroi.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legovideomanager.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\legoworldpresenter.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxatomid.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxbackgroundaudiomanager.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxbitmap.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxbool.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxcore.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdirectdraw.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsaction.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxdsfile.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxomni.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxomnicreateflags.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxomnicreateparam.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxpalette.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxrect32.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxresult.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxstreamcontroller.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxstreamer.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxstring.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxticklemanager.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxtimer.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxtransitionmanager.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxvariabletable.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxvideoparam.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Source File - -SOURCE=.\LEGO1\mxvideoparamflags.h - -!IF "$(CFG)" == "ISLE - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -!ENDIF - -# End Source File -################################################################################ -# Begin Project Dependency - -# Project_Dep_Name "LEGO1" - -!IF "$(CFG)" == "ISLE - Win32 Release" - -"LEGO1 - Win32 Release" : - $(MAKE) /$(MAKEFLAGS) /F ".\isle.mak" CFG="LEGO1 - Win32 Release" - -!ELSEIF "$(CFG)" == "ISLE - Win32 Debug" - -"LEGO1 - Win32 Debug" : - $(MAKE) /$(MAKEFLAGS) /F ".\isle.mak" CFG="LEGO1 - Win32 Debug" - -!ENDIF - -# End Project Dependency -################################################################################ -# Begin Source File - -SOURCE=.\ISLE\isleapp.cpp -DEP_CPP_ISLEAP=\ - ".\ISLE\define.h"\ - ".\ISLE\isleapp.h"\ - ".\ISLE\res\resource.h"\ - ".\LEGO1\isle.h"\ - ".\LEGO1\lego3dmanager.h"\ - ".\LEGO1\lego3dview.h"\ - ".\LEGO1\legoanimationmanager.h"\ - ".\LEGO1\legobuildingmanager.h"\ - ".\LEGO1\legoentity.h"\ - ".\LEGO1\legoentitypresenter.h"\ - ".\LEGO1\legogamestate.h"\ - ".\LEGO1\legoinputmanager.h"\ - ".\LEGO1\legomodelpresenter.h"\ - ".\LEGO1\legonavcontroller.h"\ - ".\LEGO1\legoomni.h"\ - ".\LEGO1\legopartpresenter.h"\ - ".\LEGO1\legoplantmanager.h"\ - ".\LEGO1\legoroi.h"\ - ".\LEGO1\legovideomanager.h"\ - ".\LEGO1\legoworld.h"\ - ".\LEGO1\legoworldpresenter.h"\ - ".\LEGO1\mxatomid.h"\ - ".\LEGO1\mxbackgroundaudiomanager.h"\ - ".\LEGO1\mxcompositepresenter.h"\ - ".\LEGO1\mxcore.h"\ - ".\LEGO1\mxcriticalsection.h"\ - ".\LEGO1\mxdirectdraw.h"\ - ".\LEGO1\mxdsaction.h"\ - ".\LEGO1\mxdsfile.h"\ - ".\LEGO1\mxdsobject.h"\ - ".\LEGO1\mxdssource.h"\ - ".\LEGO1\mxentity.h"\ - ".\LEGO1\mxeventmanager.h"\ - ".\LEGO1\mxioinfo.h"\ - ".\LEGO1\mxmediapresenter.h"\ - ".\LEGO1\mxmusicmanager.h"\ - ".\LEGO1\mxnotificationmanager.h"\ - ".\LEGO1\mxobjectfactory.h"\ - ".\LEGO1\mxomni.h"\ - ".\LEGO1\mxomnicreateflags.h"\ - ".\LEGO1\mxomnicreateparam.h"\ - ".\LEGO1\mxomnicreateparambase.h"\ - ".\LEGO1\mxpalette.h"\ - ".\LEGO1\mxpresenter.h"\ - ".\LEGO1\mxrect32.h"\ - ".\LEGO1\mxsoundmanager.h"\ - ".\LEGO1\mxstreamcontroller.h"\ - ".\LEGO1\mxstreamer.h"\ - ".\LEGO1\mxstring.h"\ - ".\LEGO1\mxticklemanager.h"\ - ".\LEGO1\mxtimer.h"\ - ".\LEGO1\mxtransitionmanager.h"\ - ".\LEGO1\mxtypes.h"\ - ".\LEGO1\mxunknown100dc6b0.h"\ - ".\LEGO1\mxvariabletable.h"\ - ".\LEGO1\mxvideomanager.h"\ - ".\LEGO1\mxvideoparam.h"\ - ".\LEGO1\mxvideoparamflags.h"\ - ".\LEGO1\mxvideopresenter.h"\ - ".\LEGO1\viewmanager.h"\ - - -"$(INTDIR)\isleapp.obj" : $(SOURCE) $(DEP_CPP_ISLEAP) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -# End Source File -# End Target -# End Project -################################################################################ diff --git a/isle.mdp b/isle.mdp deleted file mode 100644 index a5fc4336c047d2ec813b3d9e4b9a8ed8026f48de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78336 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 Date: Thu, 29 Jun 2023 21:45:29 -0700 Subject: [PATCH 15/34] Update README.md [skip ci] --- README.md | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index f89f1f15..bc4c4802 100644 --- a/README.md +++ b/README.md @@ -2,47 +2,53 @@ [Development Vlog](https://www.youtube.com/playlist?list=PLbpl-gZkNl2COf_bB6cfgTapD5WduAfPz) | [Contributing](https://github.com/isledecomp/isle/blob/master/CONTRIBUTING.md) | [Matrix](https://matrix.to/#/#isledecomp:matrix.org) | [Forums](https://forum.mattkc.com/viewforum.php?f=1) | [Patreon](https://www.patreon.com/mattkc) -This is a **work-in-progress** decompilation of LEGO Island version 1.1. It aims to be relatively faithful, but not byte accurate. The goal is to provide a workable codebase that can be modified, improved, and ported to other platforms later on. +This is a **work-in-progress** decompilation of LEGO Island version 1.1. It aims to be as accurate as possible, matching the recompiled instructions to the original machine code as much as possible. The goal is to provide a workable codebase that can be modified, improved, and ported to other platforms later on. ## Status -Currently `ISLE.EXE` is completely decompiled, however there are some known inaccuracies. It should work if you pair it with the original game's `LEGO1.DLL` (and other files), however small things may not work correctly yet. Work on decompiling `LEGO1.DLL` has only just started and currently it is too incomplete to be usable. +Currently `ISLE.EXE` is completely decompiled and behaves identically to the original. A handful of stubborn instructions are not yet matching, however we anticipate they will as more of the overall codebase is implemented. + +`LEGO1.DLL` is still very much incomplete and cannot be used at this time. Instead, if you want to test this, it is recommended to pair the recompiled `ISLE.EXE` with the `LEGO1.DLL` from the original game. ## Building -LEGO Island was compiled with Microsoft Visual C++ 4.20, so that's what this decompilation targets. However it should compile with NMAKE on newer versions of Visual Studio too. +This projects uses the [CMake](https://cmake.org/) build system, which allows for a high degree of versatility regarding compilers and development environments. For the most accurate results, it is recommended to use Microsoft Visual C++ 4.20 (the same compiler used to build the original game). Since we're trying to match this to the original executable as closely as possible, all contributions will be graded with the output of this compiler. -### Recommended Instructions -These instructions use the development IDE from Visual C++ 4.20. By modern standards, it can be a little clunky to use, especially on newer versions of Windows, however it's still relatively straightforward. If you prefer a command line process that can fit into a modern workflow/IDE, see the instructions below. +These instructions will outline how to compile this repository into an accurate instruction-matching binary with Visual C++ 4.2. If you wish, you can try using other compilers, but this is at your own risk and won't be covered in this guide. -1. Install Microsoft Visual C++ 4.20. This can be found on many abandonware sites, but the installer can be a little iffy on modern versions of Windows. For convenience, I made a [portable version](https://github.com/itsmattkc/msvc420) that can be downloaded and used quickly instead. -2. Download and install the DirectX 5 SDK. Similarly, this can be found on many abandonware sites. -3. Open "Microsoft Developer Studio" (`BIN/MSDEV.EXE` for those using the portable). -4. `File` > `Open Workspace` -5. Select `ISLE.MDP` from this repository. -6. Select a build configuration. `ISLE - Win32 Release` is recommended because, at this point in time, you'll almost certainly be pairing it with the retail `LEGO1.DLL`, which is also a release build. -7. `Build` > `Build ISLE.EXE`. This will build `ISLE.EXE` in a folder called `Release`. It will also build `LEGO1.DLL` since it's listed as a dependency, however the `LEGO1.DLL` produced is too incomplete to be usable at this time. +#### Prerequisites -### Command Line Instructions +You will need the following software installed: -For some users, this may be preferable to using an obsolete graphical IDE. Any modern IDE should support custom command line build steps, making this potentially easier to fit into a familiar contemporary workflow. This guide assumes a general familiarity with the Windows command prompt. +- Microsoft Visual C++ 4.2. This can be found on many abandonware sites, but the installer can be a little iffy on modern versions of Windows. For convenience, I made a [portable version](https://github.com/itsmattkc/msvc420) that can be downloaded and used quickly instead. +- DirectX 5 SDK. Similarly, this can be found on many abandonware sites. +- [CMake](https://cmake.org/). A copy is often included with the "Desktop development with C++" workload in newer versions of Visual Studio, however it can also be installed as a standalone app. -1. Acquire Visual Studio/Visual C++. Any version after 4.20 should work here, but 4.20 is the only one guaranteed to work. If you wish to use 4.20, it can be found on many abandonware sites, but the installer can be a little iffy on modern versions of Windows. For convenience, I made a [portable version](https://github.com/itsmattkc/msvc420) that can be downloaded and used quickly instead. -2. Download and install the DirectX 5 SDK. Similarly, this can be found on many abandonware sites, but later versions of Visual Studio include the DirectX SDK by default, so this step may be skippable (you definitely need it for MSVC 4.20). -3. Open an x86/32-bit developer command prompt. Depending on the version of VS you're using, you may have a start menu item for it already (e.g. `x86 Native Tools Command Prompt`). Alternatively, you can start a normal command prompt (`cmd`) and run `vcvars32.bat` from the Visual Studio folder (run `BIN/VCVARS32.BAT x86` if you're using the portable 4.20). -4. `cd` to the folder you cloned this repository to. -5. `mkdir Release` if the folder doesn't already exist. Some versions of NMAKE may make this folder by itself, but some don't. -6. Run `nmake /f isle.mak CFG="ISLE - Win32 Release"`. This will build `ISLE.EXE` in the `Release` folder you just made. It will also build `LEGO1.DLL` since it's listed as a dependency, however the `LEGO1.DLL` produced is too incomplete to be usable at this time. +#### Compiling From Command Line + +1. Open a Command Prompt (`cmd`). +1. From Visual C++ 4.2, run `BIN/VCVARS32.BAT x86` to populate the path and other environment variables for compiling with MSVC. +1. Make a folder for compiled objects to go, such as a `build` folder inside the source repository (the folder you cloned/downloaded to). +1. In your Command Prompt, `cd` to the build folder. +1. Configure the project with CMake by running: +``` +cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo +``` + - Replace `` with the source repository. Can be `..` if your build folder is inside the source repository. + - `RelWithDebInfo` is recommended because it will produce debug symbols useful for further decompilation work. However, you can change this to `Release` if you don't need them. `Debug` builds are not recommended because they are unlikely to be compatible with the retail `LEGO1.DLL`, which is currently the only way to really use this decomp. + - `NMake Makefiles` is most recommended because it will be immediately compatible with Visual C++ 4.2. For faster builds, you can use `Ninja` (if you have it installed), however due to limitations in Visual C++ 4.2, you can only build `Release` builds this way (debug symbols cannot be generated with `Ninja`). +1. Build the project by running `nmake` or `cmake --build ` +1. When this is done, there should a recompiled `ISLE.EXE` and `LEGO1.DLL` in the build folder. + +If you have a CMake-compatible IDE, it should be pretty straightforward to use this repository, as long as you can use `VCVARS32.BAT` and set the generator to `NMake Makefiles`. ## Usage Simply place the compiled `ISLE.EXE` into LEGO Island's install folder (usually `C:\Program Files\LEGO Island` or `C:\Program Files (x86)\LEGO Island`). Unless you're a developer, disregard the compiled `LEGO1.DLL` for now as it is too incomplete to be usable. Alternatively, LEGO Island can run from any directory as long as `ISLE.EXE` and `LEGO1.DLL` are in the same directory, and the registry keys point to the correct location for the asset files. -Ideally, this decompilation should be paired with version 1.1. It may work on 1.0 too, however this is not guaranteed. - ## Contributing If you're interested in helping/contributing to this project, check out the [CONTRIBUTING](https://github.com/isledecomp/isle/blob/master/CONTRIBUTING.md) page. From 4c9e138cbfb1167b39e89c2e3221bbe76386602c Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:34:39 -0700 Subject: [PATCH 16/34] implement all DLL exports (as TODOs) Now we can use our own compiled LEGO1.LIB rather than one generated from the original. Also implements a script that tests them to help ensure future commits don't break them. --- .github/workflows/build.yml | 5 + CMakeLists.txt | 336 +++++++++++++++++---------------- ISLE/ext/lego1.def | 137 -------------- ISLE/ext/lego1.exp | Bin 21310 -> 0 bytes ISLE/ext/lego1.lib | Bin 100720 -> 0 bytes LEGO1/dllmain.cpp | 2 +- LEGO1/legoanimationmanager.cpp | 9 + LEGO1/legobackgroundcolor.cpp | 7 + LEGO1/legobuildingmanager.cpp | 11 ++ LEGO1/legogamestate.cpp | 45 +++++ LEGO1/legoinputmanager.cpp | 18 ++ LEGO1/legomodelpresenter.cpp | 10 + LEGO1/legoomni.cpp | 70 +++++++ LEGO1/legoomni.h | 4 +- LEGO1/legopartpresenter.cpp | 14 ++ LEGO1/legopartpresenter.h | 2 + LEGO1/legopathboundary.h | 9 + LEGO1/legoroi.cpp | 17 ++ LEGO1/legoroi.h | 4 +- LEGO1/mxbitmap.cpp | 27 +++ LEGO1/mxbitmap.h | 2 + LEGO1/mxdirectdraw.cpp | 22 +++ LEGO1/mxomni.cpp | 48 ++++- LEGO1/mxomni.h | 9 +- LEGO1/mxpalette.cpp | 15 +- LEGO1/mxpalette.h | 2 +- LEGO1/mxscheduler.cpp | 15 ++ LEGO1/mxstreamer.cpp | 14 ++ LEGO1/mxtransitionmanager.cpp | 6 + LEGO1/mxvariabletable.cpp | 20 ++ LEGO1/mxvideomanager.cpp | 6 + LEGO1/realtimeview.cpp | 32 ++++ LEGO1/viewmanager.cpp | 7 + tools/verexp/DUMPBIN.EXE | Bin 0 -> 5632 bytes tools/verexp/LINK.EXE | Bin 0 -> 514048 bytes tools/verexp/MSPDB41.DLL | Bin 0 -> 271872 bytes tools/verexp/verexp.py | 82 ++++++++ 37 files changed, 694 insertions(+), 313 deletions(-) delete mode 100644 ISLE/ext/lego1.def delete mode 100644 ISLE/ext/lego1.exp delete mode 100644 ISLE/ext/lego1.lib create mode 100644 LEGO1/legobackgroundcolor.cpp create mode 100644 LEGO1/legogamestate.cpp create mode 100644 LEGO1/legomodelpresenter.cpp create mode 100644 LEGO1/legopartpresenter.cpp create mode 100644 LEGO1/legopathboundary.h create mode 100644 LEGO1/legoroi.cpp create mode 100644 LEGO1/mxbitmap.cpp create mode 100644 LEGO1/mxdirectdraw.cpp create mode 100644 LEGO1/mxscheduler.cpp create mode 100644 LEGO1/mxvariabletable.cpp create mode 100644 LEGO1/realtimeview.cpp create mode 100644 LEGO1/viewmanager.cpp create mode 100755 tools/verexp/DUMPBIN.EXE create mode 100755 tools/verexp/LINK.EXE create mode 100644 tools/verexp/MSPDB41.DLL create mode 100755 tools/verexp/verexp.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3e2b0d64..7ae88155 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,6 +97,11 @@ jobs: diff -u ISLEPROGRESS-OLD.TXT ISLEPROGRESS.TXT || true diff -u LEGO1PROGRESS-OLD.TXT LEGO1PROGRESS.TXT || true + + - name: Test Exports + shell: bash + run: | + python3 tools/verexp/verexp.py legobin/LEGO1.DLL build/LEGO1.DLL - name: Upload Artifact uses: actions/upload-artifact@master diff --git a/CMakeLists.txt b/CMakeLists.txt index 11927c11..5c5900ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,176 @@ cmake_minimum_required(VERSION 2.8...3.5 FATAL_ERROR) project(isle CXX) option(ISLE_BUILD_APP "Build ISLE.EXE application" ON) -option(ISLE_BUILD_LIB "Build LEGO1.DLL library" ON) + +add_library(lego1 SHARED + LEGO1/act1state.cpp + LEGO1/act2brick.cpp + LEGO1/act2policestation.cpp + LEGO1/act3.cpp + LEGO1/act3shark.cpp + LEGO1/act3state.cpp + LEGO1/ambulance.cpp + LEGO1/ambulancemissionstate.cpp + LEGO1/animstate.cpp + LEGO1/beachhouseentity.cpp + LEGO1/bike.cpp + LEGO1/buildingentity.cpp + LEGO1/bumpbouy.cpp + LEGO1/carrace.cpp + LEGO1/dllmain.cpp + LEGO1/dunebuggy.cpp + LEGO1/elevatorbottom.cpp + LEGO1/gasstation.cpp + LEGO1/gasstationentity.cpp + LEGO1/gasstationstate.cpp + LEGO1/helicopter.cpp + LEGO1/helicopterstate.cpp + LEGO1/historybook.cpp + LEGO1/hospital.cpp + LEGO1/hospitalentity.cpp + LEGO1/hospitalstate.cpp + LEGO1/infocenter.cpp + LEGO1/infocenterdoor.cpp + LEGO1/infocenterentity.cpp + LEGO1/infocenterstate.cpp + LEGO1/isle.cpp + LEGO1/isleactor.cpp + LEGO1/islepathactor.cpp + LEGO1/jetski.cpp + LEGO1/jetskirace.cpp + LEGO1/jukebox.cpp + LEGO1/jukeboxentity.cpp + LEGO1/jukeboxstate.cpp + LEGO1/legoact2state.cpp + LEGO1/legoactioncontrolpresenter.cpp + LEGO1/legoanimactor.cpp + LEGO1/legoanimationmanager.cpp + LEGO1/legoanimmmpresenter.cpp + LEGO1/legoanimpresenter.cpp + LEGO1/legobackgroundcolor.cpp + LEGO1/legobuildingmanager.cpp + LEGO1/legocachesound.cpp + LEGO1/legocameracontroller.cpp + LEGO1/legocarbuild.cpp + LEGO1/legocarbuildanimpresenter.cpp + LEGO1/legocontrolmanager.cpp + LEGO1/legoentity.cpp + LEGO1/legoentitypresenter.cpp + LEGO1/legoflctexturepresenter.cpp + LEGO1/legogamestate.cpp + LEGO1/legohideanimpresenter.cpp + LEGO1/legoinputmanager.cpp + LEGO1/legojetski.cpp + LEGO1/legoloadcachesoundpresenter.cpp + LEGO1/legolocomotionanimpresenter.cpp + LEGO1/legomodelpresenter.cpp + LEGO1/legonavcontroller.cpp + LEGO1/legoomni.cpp + LEGO1/legopalettepresenter.cpp + LEGO1/legopartpresenter.cpp + LEGO1/legopathactor.cpp + LEGO1/legopathcontroller.cpp + LEGO1/legopathpresenter.cpp + LEGO1/legophonemepresenter.cpp + LEGO1/legoplantmanager.cpp + LEGO1/legorace.cpp + LEGO1/legoroi.cpp + LEGO1/legosoundmanager.cpp + LEGO1/legostate.cpp + LEGO1/legotexturepresenter.cpp + LEGO1/legovideomanager.cpp + LEGO1/legoworld.cpp + LEGO1/legoworldpresenter.cpp + LEGO1/motorcycle.cpp + LEGO1/mxatomid.cpp + LEGO1/mxaudiopresenter.cpp + LEGO1/mxautolocker.cpp + LEGO1/mxbackgroundaudiomanager.cpp + LEGO1/mxbitmap.cpp + LEGO1/mxcompositemediapresenter.cpp + LEGO1/mxcompositepresenter.cpp + LEGO1/mxcontrolpresenter.cpp + LEGO1/mxcore.cpp + LEGO1/mxcriticalsection.cpp + LEGO1/mxdirectdraw.cpp + LEGO1/mxdiskstreamcontroller.cpp + LEGO1/mxdiskstreamprovider.cpp + LEGO1/mxdsaction.cpp + LEGO1/mxdsanim.cpp + LEGO1/mxdschunk.cpp + LEGO1/mxdsevent.cpp + LEGO1/mxdsfile.cpp + LEGO1/mxdsmediaaction.cpp + LEGO1/mxdsmultiaction.cpp + LEGO1/mxdsobject.cpp + LEGO1/mxdsobjectaction.cpp + LEGO1/mxdsparallelaction.cpp + LEGO1/mxdsselectaction.cpp + LEGO1/mxdsserialaction.cpp + LEGO1/mxdssound.cpp + LEGO1/mxdssource.cpp + LEGO1/mxdsstill.cpp + LEGO1/mxdssubscriber.cpp + LEGO1/mxentity.cpp + LEGO1/mxeventmanager.cpp + LEGO1/mxeventpresenter.cpp + LEGO1/mxflcpresenter.cpp + LEGO1/mxioinfo.cpp + LEGO1/mxloopingflcpresenter.cpp + LEGO1/mxloopingsmkpresenter.cpp + LEGO1/mxmediapresenter.cpp + LEGO1/mxmusicpresenter.cpp + LEGO1/mxnotificationmanager.cpp + LEGO1/mxomni.cpp + LEGO1/mxomnicreateflags.cpp + LEGO1/mxomnicreateparam.cpp + LEGO1/mxomnicreateparambase.cpp + LEGO1/mxpalette.cpp + LEGO1/mxpresenter.cpp + LEGO1/mxscheduler.cpp + LEGO1/mxsmkpresenter.cpp + LEGO1/mxsoundmanager.cpp + LEGO1/mxsoundpresenter.cpp + LEGO1/mxstillpresenter.cpp + LEGO1/mxstreamer.cpp + LEGO1/mxstring.cpp + LEGO1/mxtimer.cpp + LEGO1/mxtransitionmanager.cpp + LEGO1/mxunknown100dc6b0.cpp + LEGO1/mxvariabletable.cpp + LEGO1/mxvideomanager.cpp + LEGO1/mxvideoparam.cpp + LEGO1/mxvideoparamflags.cpp + LEGO1/mxvideopresenter.cpp + LEGO1/mxwavepresenter.cpp + LEGO1/pizza.cpp + LEGO1/pizzamissionstate.cpp + LEGO1/pizzeria.cpp + LEGO1/pizzeriastate.cpp + LEGO1/police.cpp + LEGO1/policeentity.cpp + LEGO1/policestate.cpp + LEGO1/racecar.cpp + LEGO1/racestandsentity.cpp + LEGO1/racestate.cpp + LEGO1/radio.cpp + LEGO1/radiostate.cpp + LEGO1/realtimeview.cpp + LEGO1/registrationbook.cpp + LEGO1/score.cpp + LEGO1/scorestate.cpp + LEGO1/skateboard.cpp + LEGO1/towtrack.cpp + LEGO1/towtrackmissionstate.cpp + LEGO1/viewmanager.cpp +) + +# Link libraries +target_link_libraries(lego1 PRIVATE ddraw dsound winmm) + +# Make sure filenames are ALL CAPS +set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1) +set_property(TARGET lego1 PROPERTY SUFFIX ".DLL") if (ISLE_BUILD_APP) add_executable(isle WIN32 @@ -15,175 +184,14 @@ if (ISLE_BUILD_APP) # Include LEGO1 headers in ISLE target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1") - # Link DSOUND, WINMM, and our fake LEGO1 lib (TODO: replace with real once all exports are implemented) - target_link_libraries(isle PRIVATE dsound winmm "${CMAKE_SOURCE_DIR}/ISLE/ext/lego1.lib") + # Link DSOUND, WINMM, and LEGO1 + target_link_libraries(isle PRIVATE dsound winmm lego1) # Make sure filenames are ALL CAPS set_property(TARGET isle PROPERTY OUTPUT_NAME ISLE) set_property(TARGET isle PROPERTY SUFFIX ".EXE") endif() -if (ISLE_BUILD_LIB) - add_library(lego1 SHARED - LEGO1/act1state.cpp - LEGO1/act2brick.cpp - LEGO1/act2policestation.cpp - LEGO1/act3.cpp - LEGO1/act3shark.cpp - LEGO1/act3state.cpp - LEGO1/ambulance.cpp - LEGO1/ambulancemissionstate.cpp - LEGO1/animstate.cpp - LEGO1/beachhouseentity.cpp - LEGO1/bike.cpp - LEGO1/buildingentity.cpp - LEGO1/bumpbouy.cpp - LEGO1/carrace.cpp - LEGO1/dllmain.cpp - LEGO1/dunebuggy.cpp - LEGO1/elevatorbottom.cpp - LEGO1/gasstation.cpp - LEGO1/gasstationentity.cpp - LEGO1/gasstationstate.cpp - LEGO1/helicopter.cpp - LEGO1/helicopterstate.cpp - LEGO1/historybook.cpp - LEGO1/hospital.cpp - LEGO1/hospitalentity.cpp - LEGO1/hospitalstate.cpp - LEGO1/infocenter.cpp - LEGO1/infocenterdoor.cpp - LEGO1/infocenterentity.cpp - LEGO1/infocenterstate.cpp - LEGO1/isle.cpp - LEGO1/isleactor.cpp - LEGO1/islepathactor.cpp - LEGO1/jetski.cpp - LEGO1/jetskirace.cpp - LEGO1/jukebox.cpp - LEGO1/jukeboxentity.cpp - LEGO1/jukeboxstate.cpp - LEGO1/legoact2state.cpp - LEGO1/legoactioncontrolpresenter.cpp - LEGO1/legoanimactor.cpp - LEGO1/legoanimationmanager.cpp - LEGO1/legoanimmmpresenter.cpp - LEGO1/legoanimpresenter.cpp - LEGO1/legobuildingmanager.cpp - LEGO1/legocachesound.cpp - LEGO1/legocameracontroller.cpp - LEGO1/legocarbuild.cpp - LEGO1/legocarbuildanimpresenter.cpp - LEGO1/legocontrolmanager.cpp - LEGO1/legoentity.cpp - LEGO1/legoentitypresenter.cpp - LEGO1/legoflctexturepresenter.cpp - LEGO1/legohideanimpresenter.cpp - LEGO1/legoinputmanager.cpp - LEGO1/legojetski.cpp - LEGO1/legoloadcachesoundpresenter.cpp - LEGO1/legolocomotionanimpresenter.cpp - LEGO1/legonavcontroller.cpp - LEGO1/legoomni.cpp - LEGO1/legopalettepresenter.cpp - LEGO1/legopathactor.cpp - LEGO1/legopathcontroller.cpp - LEGO1/legopathpresenter.cpp - LEGO1/legophonemepresenter.cpp - LEGO1/legoplantmanager.cpp - LEGO1/legorace.cpp - LEGO1/legosoundmanager.cpp - LEGO1/legostate.cpp - LEGO1/legotexturepresenter.cpp - LEGO1/legovideomanager.cpp - LEGO1/legoworld.cpp - LEGO1/legoworldpresenter.cpp - LEGO1/motorcycle.cpp - LEGO1/mxatomid.cpp - LEGO1/mxaudiopresenter.cpp - LEGO1/mxautolocker.cpp - LEGO1/mxbackgroundaudiomanager.cpp - LEGO1/mxcompositemediapresenter.cpp - LEGO1/mxcompositepresenter.cpp - LEGO1/mxcontrolpresenter.cpp - LEGO1/mxcore.cpp - LEGO1/mxcriticalsection.cpp - LEGO1/mxdiskstreamcontroller.cpp - LEGO1/mxdiskstreamprovider.cpp - LEGO1/mxdsaction.cpp - LEGO1/mxdsanim.cpp - LEGO1/mxdschunk.cpp - LEGO1/mxdsevent.cpp - LEGO1/mxdsfile.cpp - LEGO1/mxdsmediaaction.cpp - LEGO1/mxdsmultiaction.cpp - LEGO1/mxdsobject.cpp - LEGO1/mxdsobjectaction.cpp - LEGO1/mxdsparallelaction.cpp - LEGO1/mxdsselectaction.cpp - LEGO1/mxdsserialaction.cpp - LEGO1/mxdssound.cpp - LEGO1/mxdssource.cpp - LEGO1/mxdsstill.cpp - LEGO1/mxdssubscriber.cpp - LEGO1/mxentity.cpp - LEGO1/mxeventmanager.cpp - LEGO1/mxeventpresenter.cpp - LEGO1/mxflcpresenter.cpp - LEGO1/mxioinfo.cpp - LEGO1/mxloopingflcpresenter.cpp - LEGO1/mxloopingsmkpresenter.cpp - LEGO1/mxmediapresenter.cpp - LEGO1/mxmusicpresenter.cpp - LEGO1/mxnotificationmanager.cpp - LEGO1/mxomni.cpp - LEGO1/mxomnicreateflags.cpp - LEGO1/mxomnicreateparam.cpp - LEGO1/mxomnicreateparambase.cpp - LEGO1/mxpalette.cpp - LEGO1/mxpresenter.cpp - LEGO1/mxsmkpresenter.cpp - LEGO1/mxsoundmanager.cpp - LEGO1/mxsoundpresenter.cpp - LEGO1/mxstillpresenter.cpp - LEGO1/mxstreamer.cpp - LEGO1/mxstring.cpp - LEGO1/mxtimer.cpp - LEGO1/mxtransitionmanager.cpp - LEGO1/mxunknown100dc6b0.cpp - LEGO1/mxvideomanager.cpp - LEGO1/mxvideoparam.cpp - LEGO1/mxvideoparamflags.cpp - LEGO1/mxvideopresenter.cpp - LEGO1/mxwavepresenter.cpp - LEGO1/pizza.cpp - LEGO1/pizzamissionstate.cpp - LEGO1/pizzeria.cpp - LEGO1/pizzeriastate.cpp - LEGO1/police.cpp - LEGO1/policeentity.cpp - LEGO1/policestate.cpp - LEGO1/racecar.cpp - LEGO1/racestandsentity.cpp - LEGO1/racestate.cpp - LEGO1/radio.cpp - LEGO1/radiostate.cpp - LEGO1/registrationbook.cpp - LEGO1/score.cpp - LEGO1/scorestate.cpp - LEGO1/skateboard.cpp - LEGO1/towtrack.cpp - LEGO1/towtrackmissionstate.cpp - ) - - # Link libraries - target_link_libraries(lego1 PRIVATE ddraw dsound winmm) - - # Make sure filenames are ALL CAPS - set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1) - set_property(TARGET lego1 PROPERTY SUFFIX ".DLL") -endif() - if (MSVC) # These flags have been taken from the defaults for a Visual C++ 4.20 project (the compiler the # game was originally built with) and tweaked slightly to produce more debugging info for reccmp. diff --git a/ISLE/ext/lego1.def b/ISLE/ext/lego1.def deleted file mode 100644 index eb8c8fb3..00000000 --- a/ISLE/ext/lego1.def +++ /dev/null @@ -1,137 +0,0 @@ -; -; Definition file of Lego1.dll -; Automatic generated by gendef -; written by Kai Tietz 2008 -; -LIBRARY "Lego1.dll" -EXPORTS -??0LegoBackgroundColor@@QAE@PBD0@Z ; has WINAPI (@8) -??0LegoGameState@@QAE@XZ -??0LegoWorld@@QAE@XZ -??0MxAtomId@@QAE@PBDW4LookupMode@@@Z ; has WINAPI (@8) -??0MxBitmap@@QAE@XZ -??0MxCore@@QAE@XZ -??0MxCriticalSection@@QAE@XZ -??0MxDSAction@@QAE@XZ -??0MxDSFile@@QAE@PBDK@Z ; has WINAPI (@8) -??0MxOmniCreateFlags@@QAE@XZ -??0MxOmniCreateParam@@QAE@PBDPAUHWND__@@AAVMxVideoParam@@VMxOmniCreateFlags@@@Z ; has WINAPI (@16) -??0MxString@@QAE@ABV0@@Z ; has WINAPI (@4) -??0MxVideoParam@@QAE@AAV0@@Z ; has WINAPI (@4) -??0MxVideoParam@@QAE@AAVMxRect32@@PAVMxPalette@@KAAVMxVideoParamFlags@@@Z ; has WINAPI (@16) -??0MxVideoParam@@QAE@XZ -??0MxVideoParamFlags@@QAE@XZ -??1LegoEntity@@UAE@XZ -??1LegoGameState@@QAE@XZ -??1LegoWorld@@UAE@XZ -??1MXIOINFO@@QAE@XZ -??1MxAtomId@@QAE@XZ -??1MxBitmap@@UAE@XZ -??1MxCore@@UAE@XZ -??1MxCriticalSection@@QAE@XZ -??1MxDSAction@@UAE@XZ -??1MxDSFile@@UAE@XZ -??1MxPresenter@@UAE@XZ -??1MxString@@UAE@XZ -??1MxVideoParam@@QAE@XZ -??4MxAtomId@@QAEAAV0@ABV0@@Z ; has WINAPI (@4) -??4MxString@@QAEABV0@PBD@Z ; has WINAPI (@4) -??4MxVideoParam@@QAEAAV0@ABV0@@Z ; has WINAPI (@4) -??8MxPalette@@QAEEAAV0@@Z ; has WINAPI (@4) -?BackgroundAudioManager@@YAPAVMxBackgroundAudioManager@@XZ -?Close@MxDSFile@@UAEJXZ -?Close@MxStreamer@@QAEJPBD@Z ; has WINAPI (@4) -?CreateBackgroundAudio@LegoOmni@@QAEXXZ -?CreateInstance@LegoOmni@@SAXXZ -?CreatePalette@MxBitmap@@UAEPAVMxPalette@@XZ -?CreateStreamObject@@YAPAVMxDSObject@@PAVMxDSFile@@F@Z -?DestroyInstance@MxOmni@@SAXXZ -?Detach@MxPalette@@QAEXXZ -?DisableRMDevice@LegoVideoManager@@QAEHXZ -?DoneTickle@MxPresenter@@MAEXXZ -?Enable@MxBackgroundAudioManager@@QAEXE@Z ; has WINAPI (@4) -?Enable@MxPresenter@@UAEXE@Z ; has WINAPI (@4) -?EnableFullScreenMovie@LegoVideoManager@@QAEXEE@Z ; has WINAPI (@8) -?EnableRMDevice@LegoVideoManager@@QAEHXZ -?EndAction@MxPresenter@@UAEXXZ -?EventManager@@YAPAVMxEventManager@@XZ -?FlipToGDISurface@MxDirectDraw@@QAEHXZ -?GameState@@YAPAVLegoGameState@@XZ -?GetBufferSize@MxDSFile@@UAEKXZ -?GetCD@MxOmni@@SAPBDXZ -?GetCurrPathInfo@LegoOmni@@SAHPAPAVLegoPathBoundary@@AAH@Z -?GetDefaults@LegoNavController@@SAXPAHPAM11111111PAE@Z -?GetHD@MxOmni@@SAPBDXZ -?GetInstance@LegoOmni@@SAPAV1@XZ -?GetInstance@MxOmni@@SAPAV1@XZ -?GetInstance@MxScheduler@@SAPAV1@XZ -?GetNoCD_SourceName@@YAPBDXZ -?GetPartsThreshold@RealtimeView@@SAMXZ -?GetPrimaryBitDepth@MxDirectDraw@@SAHXZ -?GetRealTime@MxTimer@@QAEJXZ -?GetStreamBuffersNum@MxDSFile@@UAEKXZ -?GetUserMaxLOD@RealtimeView@@SAMXZ -?GetVariable@MxVariableTable@@QAEPBDPBD@Z ; has WINAPI (@4) -?Init@MxPresenter@@IAEXXZ -?InputManager@@YAPAVLegoInputManager@@XZ -?InvalidateRect@MxVideoManager@@QAEXAAVMxRect32@@@Z ; has WINAPI (@4) -?IsSound3D@MxOmni@@SAEXZ -?Lego@@YAPAVLegoOmni@@XZ -?Load@LegoGameState@@QAEJK@Z ; has WINAPI (@4) -?MSoundManager@@YAPAVMxSoundManager@@XZ -?MakeSourceName@@YAXPADPBD@Z -?MoveCursor@LegoVideoManager@@QAEXHH@Z ; has WINAPI (@8) -?MusicManager@@YAPAVMxMusicManager@@XZ -?NotificationManager@@YAPAVMxNotificationManager@@XZ -?Notify@MxCore@@UAEJAAVMxParam@@@Z ; has WINAPI (@4) -?Open@MxDSFile@@UAEJK@Z ; has WINAPI (@4) -?Open@MxStreamer@@QAEPAVMxStreamController@@PBDG@Z ; has WINAPI (@8) -?ParseExtra@MxPresenter@@MAEXXZ -?Pause@MxDirectDraw@@QAEHH@Z ; has WINAPI (@4) -?PickEntity@@YAPAVLegoEntity@@JJ@Z -?PickROI@@YAPAVLegoROI@@JJ@Z -?QueueEvent@LegoInputManager@@QAEXW4NotificationId@@EJJE@Z ; has WINAPI (@20) -?Read@MxBitmap@@UAEJPBD@Z ; has WINAPI (@4) -?Read@MxDSFile@@UAEJPAEK@Z ; has WINAPI (@8) -?RealizePalette@MxVideoManager@@UAEJPAVMxPalette@@@Z ; has WINAPI (@4) -?Register@LegoInputManager@@QAEXPAVMxCore@@@Z ; has WINAPI (@4) -?RemoveAll@ViewManager@@QAEXPAVViewROI@@@Z ; has WINAPI (@4) -?RemoveWorld@LegoOmni@@QAEXABVMxAtomId@@J@Z ; has WINAPI (@8) -?Save@LegoGameState@@QAEJK@Z ; has WINAPI (@4) -?Seek@MxDSFile@@UAEJJH@Z ; has WINAPI (@8) -?SerializePlayersInfo@LegoGameState@@QAEXF@Z ; has WINAPI (@4) -?SerializeScoreHistory@LegoGameState@@QAEXF@Z ; has WINAPI (@4) -?SetCD@MxOmni@@SAXPBD@Z -?SetDefaults@LegoNavController@@SAXHMMMMMMMMME@Z -?SetDeviceName@MxVideoParam@@QAEXPAD@Z ; has WINAPI (@4) -?SetDisplayBB@LegoROI@@QAEXH@Z ; has WINAPI (@4) -?SetDoMutex@MxCriticalSection@@SAXXZ -?SetHD@MxOmni@@SAXPBD@Z -?SetObjectName@MxDSObject@@QAEXPBD@Z ; has WINAPI (@4) -?SetOmniUserMessage@@YAXP6AXPBDH@Z@Z -?SetPartsThreshold@RealtimeView@@SAXM@Z -?SetSavePath@LegoGameState@@QAEXPAD@Z ; has WINAPI (@4) -?SetSound3D@MxOmni@@SAXE@Z -?SetUserMaxLOD@RealtimeView@@SAXM@Z -?SetVariable@MxVariableTable@@QAEXPAVMxVariable@@@Z ; has WINAPI (@4) -?SetVariable@MxVariableTable@@QAEXPBD0@Z ; has WINAPI (@8) -?SetWaitIndicator@MxTransitionManager@@QAEXPAVMxVideoPresenter@@@Z ; has WINAPI (@4) -?SoundManager@@YAPAVLegoSoundManager@@XZ -?Start@@YAJPAVMxDSAction@@@Z -?StartAction@MxPresenter@@UAEJPAVMxStreamController@@PAVMxDSAction@@@Z ; has WINAPI (@8) -?StartMultiTasking@MxScheduler@@QAEXK@Z ; has WINAPI (@4) -?Streamer@@YAPAVMxStreamer@@XZ -?Tickle@MxPresenter@@UAEJXZ -?TickleManager@@YAPAVMxTickleManager@@XZ -?Timer@@YAPAVMxTimer@@XZ -?TransitionManager@@YAPAVMxTransitionManager@@XZ -?UnRegister@LegoInputManager@@QAEXPAVMxCore@@@Z ; has WINAPI (@4) -?VariableTable@@YAPAVMxVariableTable@@XZ -?VideoManager@@YAPAVLegoVideoManager@@XZ -?configureLegoAnimationManager@LegoAnimationManager@@SAXH@Z -?configureLegoBuildingManager@LegoBuildingManager@@SAXH@Z -?configureLegoModelPresenter@LegoModelPresenter@@SAXH@Z -?configureLegoPartPresenter@LegoPartPresenter@@SAXHH@Z -?configureLegoROI@LegoROI@@SAXH@Z -?configureLegoWorldPresenter@LegoWorldPresenter@@SAXH@Z -_DllMain@12@12 diff --git a/ISLE/ext/lego1.exp b/ISLE/ext/lego1.exp deleted file mode 100644 index 300d78fd0e2de13fbf715e9210396c9390a239da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21310 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 Z-`UsaM$^qv;=tAh@6jQWQp!{vs%h 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 heAaRj}9V // OFFSET: LEGO1 0x10091ee0 -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +__declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { return TRUE; } diff --git a/LEGO1/legoanimationmanager.cpp b/LEGO1/legoanimationmanager.cpp index 48f13ce8..c25aa436 100644 --- a/LEGO1/legoanimationmanager.cpp +++ b/LEGO1/legoanimationmanager.cpp @@ -1,5 +1,8 @@ #include "legoanimationmanager.h" +// 0x100f74f8 +int g_legoAnimationManagerConfig = 1; + // OFFSET: LEGO1 0x1005eb60 STUB LegoAnimationManager::LegoAnimationManager() { @@ -32,3 +35,9 @@ void LegoAnimationManager::Init() { // TODO } + +// OFFSET: LEGO1 0x1005eb50 +void LegoAnimationManager::configureLegoAnimationManager(int param_1) +{ + g_legoAnimationManagerConfig = param_1; +} diff --git a/LEGO1/legobackgroundcolor.cpp b/LEGO1/legobackgroundcolor.cpp new file mode 100644 index 00000000..17d24108 --- /dev/null +++ b/LEGO1/legobackgroundcolor.cpp @@ -0,0 +1,7 @@ +#include "legobackgroundcolor.h" + +// OFFSET: LEGO1 0x1003bfb0 +LegoBackgroundColor::LegoBackgroundColor(const char *, const char *) +{ + // TODO +} diff --git a/LEGO1/legobuildingmanager.cpp b/LEGO1/legobuildingmanager.cpp index b2c4e7ea..f6706c78 100644 --- a/LEGO1/legobuildingmanager.cpp +++ b/LEGO1/legobuildingmanager.cpp @@ -1,13 +1,18 @@ #include "legobuildingmanager.h" +// 0x100f37cc +int g_buildingManagerConfig = 1; + // OFFSET: LEGO1 0x1002f8c0 STUB LegoBuildingManager::LegoBuildingManager() { + // TODO } // OFFSET: LEGO1 0x1002f960 STUB LegoBuildingManager::~LegoBuildingManager() { + // TODO } // OFFSET: LEGO1 0x1002f9d0 STUB @@ -15,3 +20,9 @@ void LegoBuildingManager::Init() { // TODO } + +// OFFSET: LEGO1 0x1002f8b0 +void LegoBuildingManager::configureLegoBuildingManager(int param_1) +{ + g_buildingManagerConfig = param_1; +} diff --git a/LEGO1/legogamestate.cpp b/LEGO1/legogamestate.cpp new file mode 100644 index 00000000..473003a7 --- /dev/null +++ b/LEGO1/legogamestate.cpp @@ -0,0 +1,45 @@ +#include "legogamestate.h" + +// OFFSET: LEGO1 0x10039550 +LegoGameState::LegoGameState() +{ + // TODO +} + +// OFFSET: LEGO1 0x10039720 +LegoGameState::~LegoGameState() +{ + // TODO +} + +// OFFSET: LEGO1 0x10039c60 +long LegoGameState::Load(unsigned long) +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x10039980 +long LegoGameState::Save(unsigned long p) +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1003a2e0 +void LegoGameState::SerializePlayersInfo(short p) +{ + // TODO +} + +// OFFSET: LEGO1 0x1003cdd0 +void LegoGameState::SerializeScoreHistory(short p) +{ + // TODO +} + +// OFFSET: LEGO1 0x10039f00 +void LegoGameState::SetSavePath(char *p) +{ + // TODO +} diff --git a/LEGO1/legoinputmanager.cpp b/LEGO1/legoinputmanager.cpp index d60f5fc7..792da404 100644 --- a/LEGO1/legoinputmanager.cpp +++ b/LEGO1/legoinputmanager.cpp @@ -12,6 +12,24 @@ LegoInputManager::~LegoInputManager() // TODO } +// OFFSET: LEGO1 0x1005c740 STUB +void LegoInputManager::QueueEvent(NotificationId id, unsigned char p2, long p3, long p4, unsigned char p5) +{ + // TODO +} + +// OFFSET: LEGO1 0x1005c470 STUB +void LegoInputManager::Register(MxCore *) +{ + // TODO +} + +// OFFSET: LEGO1 0x1005c5c0 STUB +void LegoInputManager::UnRegister(MxCore *) +{ + // TODO +} + // OFFSET: LEGO1 0x1005b8b0 STUB long LegoInputManager::Tickle() { diff --git a/LEGO1/legomodelpresenter.cpp b/LEGO1/legomodelpresenter.cpp new file mode 100644 index 00000000..b038287c --- /dev/null +++ b/LEGO1/legomodelpresenter.cpp @@ -0,0 +1,10 @@ +#include "legomodelpresenter.h" + +// 0x100f7ae0 +int g_modelPresenterConfig = 1; + +// OFFSET: LEGO1 0x1007f660 +void LegoModelPresenter::configureLegoModelPresenter(int param_1) +{ + g_modelPresenterConfig = param_1; +} diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 13b67a2c..365748e7 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -1,5 +1,11 @@ #include "legoomni.h" +// 0x100f4588 +char *g_nocdSourceName = NULL; + +// 0x101020e8 +void (*g_omniUserMessage)(const char *,int); + // OFFSET: LEGO1 0x10058a00 LegoOmni::LegoOmni() { @@ -12,6 +18,44 @@ LegoOmni::~LegoOmni() Destroy(); } +// OFFSET: LEGO1 0x1005b560 STUB +void LegoOmni::CreateBackgroundAudio() +{ + // TODO +} + +// OFFSET: LEGO1 0x1005af10 STUB +void LegoOmni::RemoveWorld(const MxAtomId &p1, long p2) +{ + // TODO +} + +// OFFSET: LEGO1 0x1005b400 STUB +int LegoOmni::GetCurrPathInfo(LegoPathBoundary **,int &) +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x100b6ff0 STUB +void MakeSourceName(char *, const char *) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b7210 +void SetOmniUserMessage(void (*p_userMsg)(const char *,int)) +{ + g_omniUserMessage = p_userMsg; +} + +// OFFSET: LEGO1 0x100acf50 STUB +long Start(MxDSAction *) +{ + // TODO + return 0; +} + // OFFSET: LEGO1 0x1005ad10 LegoOmni *LegoOmni::GetInstance() { @@ -67,6 +111,13 @@ MxBackgroundAudioManager *BackgroundAudioManager() return LegoOmni::GetInstance()->GetBackgroundAudioManager(); } +// OFFSET: LEGO1 0x100c0280 STUB +MxDSObject *CreateStreamObject(MxDSFile *,short) +{ + // TODO + return NULL; +} + // OFFSET: LEGO1 0x10015740 LegoInputManager *InputManager() { @@ -91,6 +142,11 @@ MxTransitionManager *TransitionManager() return LegoOmni::GetInstance()->GetTransitionManager(); } +// OFFSET: LEGO1 0x10053430 +const char *GetNoCD_SourceName() +{ + return g_nocdSourceName; +} // OFFSET: LEGO1 0x1005b5f0 long LegoOmni::Notify(MxParam &p) @@ -99,6 +155,20 @@ long LegoOmni::Notify(MxParam &p) return 0; } +// OFFSET: LEGO1 0x1003dd70 STUB +LegoROI *PickROI(long,long) +{ + // TODO + return NULL; +} + +// OFFSET: LEGO1 0x1003ddc0 STUB +LegoEntity *PickEntity(long,long) +{ + // TODO + return NULL; +} + // OFFSET: LEGO1 0x10058bd0 void LegoOmni::Init() { diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 05c1bfd0..9d825ebc 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -5,6 +5,7 @@ #include "legoinputmanager.h" #include "legogamestate.h" #include "legonavcontroller.h" +#include "legopathboundary.h" #include "legoroi.h" #include "legovideomanager.h" #include "mxatomid.h" @@ -27,7 +28,7 @@ class LegoOmni : public MxOmni public: __declspec(dllexport) void CreateBackgroundAudio(); __declspec(dllexport) void RemoveWorld(const MxAtomId &p1, long p2); - __declspec(dllexport) static int GetCurrPathInfo(class LegoPathBoundary * *,int &); + __declspec(dllexport) static int GetCurrPathInfo(LegoPathBoundary **,int &); __declspec(dllexport) static void CreateInstance(); __declspec(dllexport) static LegoOmni *GetInstance(); @@ -99,7 +100,6 @@ __declspec(dllexport) const char * GetNoCD_SourceName(); __declspec(dllexport) LegoInputManager * InputManager(); __declspec(dllexport) LegoOmni * Lego(); __declspec(dllexport) void MakeSourceName(char *, const char *); -__declspec(dllexport) MxNotificationManager * NotificationManager(); __declspec(dllexport) LegoEntity * PickEntity(long,long); __declspec(dllexport) LegoROI * PickROI(long,long); __declspec(dllexport) void SetOmniUserMessage(void (*)(const char *,int)); diff --git a/LEGO1/legopartpresenter.cpp b/LEGO1/legopartpresenter.cpp new file mode 100644 index 00000000..376073f0 --- /dev/null +++ b/LEGO1/legopartpresenter.cpp @@ -0,0 +1,14 @@ +#include "legopartpresenter.h" + +// 0x100f7aa0 +int g_partPresenterConfig1 = 1; + +// 0x100f7aa4 +int g_partPresenterConfig2 = 100; + +// OFFSET: LEGO1 0x1007c990 +void LegoPartPresenter::configureLegoPartPresenter(int param_1, int param_2) +{ + g_partPresenterConfig1 = param_1; + g_partPresenterConfig2 = param_2; +} diff --git a/LEGO1/legopartpresenter.h b/LEGO1/legopartpresenter.h index 6a9a91a5..73be1709 100644 --- a/LEGO1/legopartpresenter.h +++ b/LEGO1/legopartpresenter.h @@ -1,6 +1,8 @@ #ifndef LEGOPARTPRESENTER_H #define LEGOPARTPRESENTER_H +#include "mxmediapresenter.h" + // VTABLE 0x100d4df0 // SIZE 0x54 (from inlined construction at 0x10009fac) class LegoPartPresenter : public MxMediaPresenter diff --git a/LEGO1/legopathboundary.h b/LEGO1/legopathboundary.h new file mode 100644 index 00000000..c1f9d6ff --- /dev/null +++ b/LEGO1/legopathboundary.h @@ -0,0 +1,9 @@ +#ifndef LEGOPATHBOUNDARH_H +#define LEGOPATHBOUNDARH_H + +class LegoPathBoundary +{ + +}; + +#endif // LEGOPATHBOUNDARH_H diff --git a/LEGO1/legoroi.cpp b/LEGO1/legoroi.cpp new file mode 100644 index 00000000..97ac06f8 --- /dev/null +++ b/LEGO1/legoroi.cpp @@ -0,0 +1,17 @@ +#include "legoroi.h" + +// 0x10101368 +int g_roiConfig = 100; + +// OFFSET: LEGO1 0x100a9e10 +void LegoROI::SetDisplayBB(int p_displayBB) +{ + // Intentionally empty function +} + +// OFFSET: LEGO1 0x100a81c0 +void LegoROI::configureLegoROI(int p_roi) +{ + g_roiConfig = p_roi; +} + diff --git a/LEGO1/legoroi.h b/LEGO1/legoroi.h index 8bfc0faa..3baa31fa 100644 --- a/LEGO1/legoroi.h +++ b/LEGO1/legoroi.h @@ -4,8 +4,8 @@ class LegoROI { public: - __declspec(dllexport) void SetDisplayBB(int); - __declspec(dllexport) static void configureLegoROI(int param_1); + __declspec(dllexport) void SetDisplayBB(int p_displayBB); + __declspec(dllexport) static void configureLegoROI(int p_roi); }; #endif // LEGOROI_H diff --git a/LEGO1/mxbitmap.cpp b/LEGO1/mxbitmap.cpp new file mode 100644 index 00000000..81126d9b --- /dev/null +++ b/LEGO1/mxbitmap.cpp @@ -0,0 +1,27 @@ +#include "mxbitmap.h" + +// OFFSET: LEGO1 0x100bc980 +MxBitmap::MxBitmap() +{ + // TODO +} + +// OFFSET: LEGO1 0x100bca10 +MxBitmap::~MxBitmap() +{ + // TODO +} + +// OFFSET: LEGO1 0x100bd1c0 +MxPalette *MxBitmap::CreatePalette() +{ + // TODO + return NULL; +} + +// OFFSET: LEGO1 0x100bcd10 +long MxBitmap::Read(const char *) +{ + // TODO + return 0; +} diff --git a/LEGO1/mxbitmap.h b/LEGO1/mxbitmap.h index 1613c47e..1fc54260 100644 --- a/LEGO1/mxbitmap.h +++ b/LEGO1/mxbitmap.h @@ -1,6 +1,8 @@ #ifndef MXBITMAP_H #define MXBITMAP_H +#include "mxpalette.h" + class MxBitmap { public: diff --git a/LEGO1/mxdirectdraw.cpp b/LEGO1/mxdirectdraw.cpp new file mode 100644 index 00000000..dde59ba0 --- /dev/null +++ b/LEGO1/mxdirectdraw.cpp @@ -0,0 +1,22 @@ +#include "mxdirectdraw.h" + +// OFFSET: LEGO1 0x1009e7f0 +int MxDirectDraw::FlipToGDISurface() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1009d570 +int MxDirectDraw::GetPrimaryBitDepth() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1009e6a0 +int MxDirectDraw::Pause(int) +{ + // TODO + return 0; +} diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index 9598141d..76287b82 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -1,5 +1,14 @@ #include "mxomni.h" +// 0x101015b8 +char g_hdPath[1024]; + +// 0x101019b8 +char g_cdPath[1024]; + +// 0x10101db8 +MxBool g_use3dSound; + // 0x101015b0 MxOmni *MxOmni::g_instance = NULL; @@ -43,6 +52,43 @@ void MxOmni::DestroyInstance() } } +// OFFSET: LEGO1 0x100b0900 +const char *MxOmni::GetHD() +{ + return g_hdPath; +} + +// OFFSET: LEGO1 0x100b0940 +const char *MxOmni::GetCD() +{ + return g_cdPath; +} + +// OFFSET: LEGO1 0x100b0980 +MxBool MxOmni::IsSound3D() +{ + return g_use3dSound; +} + +// OFFSET: LEGO1 0x100b0910 +void MxOmni::SetHD(const char *p_hd) +{ + strcpy(g_hdPath, p_hd); +} + +// OFFSET: LEGO1 0x100b0950 +void MxOmni::SetCD(const char *p_cd) +{ + strcpy(g_cdPath, p_cd); +} + +// OFFSET: LEGO1 0x100b0990 +void MxOmni::SetSound3D(MxBool p_3dsound) +{ + g_use3dSound = p_3dsound; +} + + // OFFSET: LEGO1 0x100b0680 MxOmni *MxOmni::GetInstance() { @@ -141,4 +187,4 @@ MxMusicManager* MusicManager() MxEventManager* EventManager() { return MxOmni::GetInstance()->GetEventManager(); -} \ No newline at end of file +} diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 6a0d3ef8..0e837ad1 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -24,10 +24,10 @@ class MxOmni : public MxCore __declspec(dllexport) static const char *GetCD(); __declspec(dllexport) static const char *GetHD(); __declspec(dllexport) static MxOmni *GetInstance(); - __declspec(dllexport) static unsigned char IsSound3D(); - __declspec(dllexport) static void SetCD(const char *s); - __declspec(dllexport) static void SetHD(const char *s); - __declspec(dllexport) static void SetSound3D(unsigned char); + __declspec(dllexport) static MxBool IsSound3D(); + __declspec(dllexport) static void SetCD(const char *p_cd); + __declspec(dllexport) static void SetHD(const char *p_hd); + __declspec(dllexport) static void SetSound3D(MxBool p_3dsound); virtual ~MxOmni(); @@ -75,5 +75,6 @@ __declspec(dllexport) MxSoundManager * MSoundManager(); __declspec(dllexport) MxVariableTable * VariableTable(); __declspec(dllexport) MxMusicManager * MusicManager(); __declspec(dllexport) MxEventManager * EventManager(); +__declspec(dllexport) MxNotificationManager * NotificationManager(); #endif // MXOMNI_H diff --git a/LEGO1/mxpalette.cpp b/LEGO1/mxpalette.cpp index dd245538..546dddf9 100644 --- a/LEGO1/mxpalette.cpp +++ b/LEGO1/mxpalette.cpp @@ -5,4 +5,17 @@ MxResult MxPalette::GetEntries(LPPALETTEENTRY p_entries) { memcpy(p_entries, this->m_entries, sizeof(this->m_entries)); return SUCCESS; -} \ No newline at end of file +} + +// OFFSET: LEGO1 0x100bf340 +MxBool MxPalette::operator==(MxPalette &) +{ + // TODO + return FALSE; +} + +// OFFSET: LEGO1 0x100bf330 +void MxPalette::Detach() +{ + // TODO +} diff --git a/LEGO1/mxpalette.h b/LEGO1/mxpalette.h index b78efd7d..7f4a4299 100644 --- a/LEGO1/mxpalette.h +++ b/LEGO1/mxpalette.h @@ -11,7 +11,7 @@ class MxPalette : public MxCore { public: - __declspec(dllexport) unsigned char operator==(MxPalette &); + __declspec(dllexport) MxBool operator==(MxPalette &); __declspec(dllexport) void Detach(); MxResult GetEntries(LPPALETTEENTRY p_entries); diff --git a/LEGO1/mxscheduler.cpp b/LEGO1/mxscheduler.cpp new file mode 100644 index 00000000..94228303 --- /dev/null +++ b/LEGO1/mxscheduler.cpp @@ -0,0 +1,15 @@ +#include "mxscheduler.h" + +// OFFSET: LEGO1 0x100bf4f0 +MxScheduler *MxScheduler::GetInstance() +{ + // Intentionally empty + return 0; +} + +// OFFSET: LEGO1 0x100bf500 +void MxScheduler::StartMultiTasking(unsigned long) +{ + // Intentionally empty +} + diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index b6da4b1d..57c9a5b8 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -6,6 +6,20 @@ MxStreamer::~MxStreamer() // TODO } +// OFFSET: LEGO1 0x100b92c0 STUB +MxStreamController *MxStreamer::Open(const char *name, unsigned short p) +{ + // TODO + return NULL; +} + +// OFFSET: LEGO1 0x100b9570 STUB +long MxStreamer::Close(const char *p) +{ + // TODO + return 0; +} + // OFFSET: LEGO1 0x100b9b60 STUB long MxStreamer::Notify(MxParam &p) { diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index 275335e5..b9631629 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -19,3 +19,9 @@ long MxTransitionManager::Tickle() return 0; } + +// OFFSET: LEGO1 0x1004c470 STUB +void MxTransitionManager::SetWaitIndicator(MxVideoPresenter *videoPresenter) +{ + // TODO +} diff --git a/LEGO1/mxvariabletable.cpp b/LEGO1/mxvariabletable.cpp new file mode 100644 index 00000000..8927bc32 --- /dev/null +++ b/LEGO1/mxvariabletable.cpp @@ -0,0 +1,20 @@ +#include "mxvariabletable.h" + +// OFFSET: LEGO1 0x100b73a0 +void MxVariableTable::SetVariable(const char *key, const char *value) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b7740 +void MxVariableTable::SetVariable(MxVariable *var) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b78f0 +const char *MxVariableTable::GetVariable(const char *key) +{ + // TODO + return 0; +} diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index 455f4f61..178bc883 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -32,6 +32,12 @@ int MxVideoManager::Init() return 0; } +// OFFSET: LEGO1 0x100bea60 STUB +void MxVideoManager::InvalidateRect(MxRect32 &p_rect) +{ + // TODO +} + // OFFSET: LEGO1 0x100bebe0 long MxVideoManager::RealizePalette(MxPalette *p_palette) { diff --git a/LEGO1/realtimeview.cpp b/LEGO1/realtimeview.cpp new file mode 100644 index 00000000..35be5b0e --- /dev/null +++ b/LEGO1/realtimeview.cpp @@ -0,0 +1,32 @@ +#include "realtimeview.h" + +// 0x10101048 +float g_userMaxLod = 3.6f; + +// 0x1010104c +float g_partsThreshold = 1000.0f; + +// OFFSET: LEGO1 0x100a5e00 +float RealtimeView::GetUserMaxLOD() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x100a5e10 +float RealtimeView::GetPartsThreshold() +{ + return g_partsThreshold; +} + +// OFFSET: LEGO1 0x100a5de0 +void RealtimeView::SetUserMaxLOD(float p_lod) +{ + g_userMaxLod = p_lod; +} + +// OFFSET: LEGO1 0x100a5df0 +void RealtimeView::SetPartsThreshold(float p_threshold) +{ + g_partsThreshold = p_threshold; +} diff --git a/LEGO1/viewmanager.cpp b/LEGO1/viewmanager.cpp new file mode 100644 index 00000000..0baebd2c --- /dev/null +++ b/LEGO1/viewmanager.cpp @@ -0,0 +1,7 @@ +#include "viewmanager.h" + +// OFFSET: LEGO1 0x100a64d0 STUB +void ViewManager::RemoveAll(ViewROI *) +{ + // TODO +} diff --git a/tools/verexp/DUMPBIN.EXE b/tools/verexp/DUMPBIN.EXE new file mode 100755 index 0000000000000000000000000000000000000000..c57ed02cf5ada945542683c25c83e4b935f79a57 GIT binary patch literal 5632 zcmeHLeQXh&%6nwUf@Tyt46v zD}H6;9z9!@N=9+qNadw;s!%AJ(jiSUDg`N9kfOVXrF=1?1=p-u6==Fn#E9aq6*T#y z*Fvpm^VI2D?ecbuq&gk$=slRbfD+RYXYF?KW)9~spoFnWa9u)??buk%ixV@2t8F|d zh|W0%OfA7E(bt!#kG*;(LiFSvw1cL0)P(#)j>&m(&WlB04UmXNgGMH0rifTq)Q+0T z$HWpuP({#DqX(HS16gks6H5>wnh9nd#RpgphKSjLxeX$$XOxXJc%mohjnLyf+aSVm z4J}uM;vbnm3S__Cz&3~wZEqu&m!F^xSkZt_Cn-W!Jm5+yhhWZ&KinxMp>?SCl(J0BM3u&AF3grQU46A09!0l7NYt&hU5z8}NjP{Q^< z4<&G`(}B%yL|J=cJ=CoefdHs_$4NfaaCH`1wP;{Nb@eVY^^+dl(& zbMxH?aKP5 zIHAi@1lwWz=N84&q8qMn^jfE#=A9Re>a1_T+Hx9dmZv)FP1wIexdW9O@2qHYomM-1 zj?vzHAEMl@`TG{P;Xv}>6O(g%S}t}_>-b#GOkqoCueC5?>pFbsH$EMqM5flm?CQei z;gNkct#K)KlWE@6H<2Imx^&lO84&?fyf`B><-ZD{wMN3a=Cl282x^0%rY&;A zzJ;^9AgsG}FGMx7?g z3@&Qi-}JZGdtS6Z%S_K+wtLx)zTGHlj1uE z9uLO$$N1+Ymn|F)LV)G1HpPl5700B!mM%3EH2bxZ^_6O%rQjvj2Rl{9;Rs%d zyIX6z&zn!>#4Y!C?qoi7SSzJWorYPS%bJ3q_3mV{gun58$uwx!@JRpAp0FIuy2vbjjS2&6%1(s~wAEwvaWo!V&tRTPz{UlN+*e&CI8=g_JQ~rq6>eYi6Yk zA!6e_P4tL6naWI5%4TvblRZLox8pBe%=0%Ek>8=m9ID6hkW7_IN%L3OMHs1BRbACw)0(} z<=gOA;;#A_WTOdu$9vf7R)~ATV2sc(B{9Zm2&Nm=rBAPka2|-IwVRDFUT*;)AEYYrciH4 z4ZRS$7Z{oL8omi^|WHHIL;Z^#c{#jvdC`KrZoPxD5a04*UZTumq<7 literal 0 HcmV?d00001 diff --git a/tools/verexp/LINK.EXE b/tools/verexp/LINK.EXE new file mode 100755 index 0000000000000000000000000000000000000000..9d35a8993d959611a7e1c15cb41bd8c3c676a784 GIT binary patch literal 514048 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%0Dw%fIS}4V*0PQ23-r0^ie}44 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%0D=lYG)_*cDJR?I* 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%0DSs~wI- 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 V`|k<-_XPfX0{=aM|Bol|{{Z)(1AYJi literal 0 HcmV?d00001 diff --git a/tools/verexp/MSPDB41.DLL b/tools/verexp/MSPDB41.DLL new file mode 100644 index 0000000000000000000000000000000000000000..9d2953e2b3308944c7fd531780fe63020a74bc71 GIT binary patch literal 271872 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%0D64W!-TzeE*> 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 literal 0 HcmV?d00001 diff --git a/tools/verexp/verexp.py b/tools/verexp/verexp.py new file mode 100755 index 00000000..6927622d --- /dev/null +++ b/tools/verexp/verexp.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 + +import argparse +import colorama +import difflib +import subprocess +import os +import sys + +parser = argparse.ArgumentParser(allow_abbrev=False, + description='Verify Exports: Compare the exports of two DLLs.') +parser.add_argument('original', metavar='original-binary', help='The original binary') +parser.add_argument('recompiled', metavar='recompiled-binary', help='The recompiled binary') +parser.add_argument('--no-color', '-n', action='store_true', help='Do not color the output') + +args = parser.parse_args() + +if not os.path.isfile(args.original): + parser.error('Original binary does not exist') + +if not os.path.isfile(args.recompiled): + parser.error('Recompiled binary does not exist') + +def get_file_in_script_dir(fn): + return os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), fn) + +def get_exports(file): + call = [get_file_in_script_dir('DUMPBIN.EXE'), '/EXPORTS'] + + if os.name != 'nt': + call.insert(0, 'wine') + file = subprocess.check_output(['winepath', '-w', file]).decode('utf-8').strip() + + call.append(file) + + raw = subprocess.check_output(call).decode('utf-8').split('\r\n') + exports = [] + + start = False + + for line in raw: + if not start: + if line == ' ordinal hint name': + start = True + else: + if line: + exports.append(line[27:line.rindex(' (')]) + elif exports: + break + + return exports + +og_exp = get_exports(args.original) +re_exp = get_exports(args.recompiled) + +udiff = difflib.unified_diff(og_exp, re_exp) +has_diff = False + +for line in udiff: + has_diff = True + if line.startswith("++") or line.startswith("@@") or line.startswith("--"): + # Skip unneeded parts of the diff for the brief view + pass + elif line.startswith("+"): + if args.no_color: + print(line) + else: + print(colorama.Fore.GREEN + line) + elif line.startswith("-"): + if args.no_color: + print(line) + else: + print(colorama.Fore.RED + line) + else: + print(line) + if not args.no_color: + print(colorama.Style.RESET_ALL, end='') + +if has_diff: + sys.exit(1) +else: + sys.exit(0) From 4adad9af494d0f7c2e9407a4f30b73d7c0e18634 Mon Sep 17 00:00:00 2001 From: MattKC <34096995+itsmattkc@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:00:27 -0700 Subject: [PATCH 17/34] ci: upload SVGs to external sites Can't embed SVGs from GitHub Releases (made an issue that will probably get ignored here https://github.com/orgs/community/discussions/59781). Uploading to external site instead for the time being. --- .github/workflows/build.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7ae88155..09bf06a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -124,17 +124,14 @@ jobs: if: github.event_name == 'push' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + UPLOAD_KEY: ${{ secrets.UPLOAD_KEY }} run: | - # Convert SVGs to PNG - INKSCAPE_DIR=inkscape-1.2.2_2022-12-09_732a01da63-x64 - curl -fLOSs https://inkscape.org/gallery/item/37364/$INKSCAPE_DIR.7z - 7z x $INKSCAPE_DIR.7z - $INKSCAPE_DIR/bin/inkscape -w 512 ISLEPROGRESS.SVG -o ISLEPROGRESS.PNG - $INKSCAPE_DIR/bin/inkscape -w 512 LEGO1PROGRESS.SVG -o LEGO1PROGRESS.PNG - curl -fLOSs https://raw.githubusercontent.com/probonopd/uploadtool/master/upload.sh ./upload.sh \ build/ISLE.EXE \ build/LEGO1.DLL \ ISLEPROGRESS.* \ LEGO1PROGRESS.* + + curl -X POST -F key=$UPLOAD_KEY -F 'file=@ISLEPROGRESS.SVG' https://legoisland.org/progress/ + curl -X POST -F key=$UPLOAD_KEY -F 'file=@LEGO1PROGRESS.SVG' https://legoisland.org/progress/ From c4d0ea8746de77b493ff7a31700196f1ad7cf07d Mon Sep 17 00:00:00 2001 From: MattKC <34096995+itsmattkc@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:06:30 -0700 Subject: [PATCH 18/34] readme: use SVGs [skip ci] Had to use an external site for this because GitHub doesn't seem to have a good way to do this right now. But this works... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc4c4802..2be5373a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is a **work-in-progress** decompilation of LEGO Island version 1.1. It aims ## Status - + Currently `ISLE.EXE` is completely decompiled and behaves identically to the original. A handful of stubborn instructions are not yet matching, however we anticipate they will as more of the overall codebase is implemented. From e929d76f3c24a623ebffcc3985169709f8af777d Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:12:12 -0700 Subject: [PATCH 19/34] reccmp: use "monospace" in svg font For some reason Inkscape made this "mono", but it seems like "monospace" is the right attribute here --- tools/reccmp/template.svg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/reccmp/template.svg b/tools/reccmp/template.svg index bd36e9b2..626ed08d 100644 --- a/tools/reccmp/template.svg +++ b/tools/reccmp/template.svg @@ -55,12 +55,12 @@ x="58.13345" y="51.967873" />{name}{percent} Date: Fri, 30 Jun 2023 19:24:00 -0400 Subject: [PATCH 20/34] Initial implementation of MxBitmap (#34) Co-authored-by: Anonymous Maarten --- LEGO1/mxbitmap.cpp | 61 ++++++++++++++++++++++++++++++++++++++++------ LEGO1/mxbitmap.h | 15 ++++++++++-- 2 files changed, 67 insertions(+), 9 deletions(-) diff --git a/LEGO1/mxbitmap.cpp b/LEGO1/mxbitmap.cpp index 81126d9b..a7425dd8 100644 --- a/LEGO1/mxbitmap.cpp +++ b/LEGO1/mxbitmap.cpp @@ -3,25 +3,72 @@ // OFFSET: LEGO1 0x100bc980 MxBitmap::MxBitmap() { - // TODO + this->m_info = NULL; + this->m_bmiHeader = NULL; + this->m_paletteData = NULL; + this->m_data = NULL; + this->m_unk18 = FALSE; + this->m_palette = NULL; } // OFFSET: LEGO1 0x100bca10 MxBitmap::~MxBitmap() { - // TODO + if (this->m_info != NULL) { + delete m_info; + } + if (this->m_data != NULL) { + delete m_data; + } + if (this->m_palette != NULL) { + delete m_palette; + } } // OFFSET: LEGO1 0x100bd1c0 MxPalette *MxBitmap::CreatePalette() { - // TODO - return NULL; + // FIXME: This function needs MxPalette to be completed. Also INFERRING usage of MxBool + MxPalette *pal = NULL; + MxPalette *ppal; + MxBool success = FALSE; + + if(this->m_unk18 == FALSE) { + // ppal = MxPalette::FromBitmapPalette(this->m_paletteData); + } else { + if(this->m_unk18 != TRUE) { + if(!success && pal != NULL) { + delete pal; + pal = NULL; + } + } + //.pal = MxPalette::Clone(this->m_palette); + } + if(pal != NULL) { + success = TRUE; + } + + return pal; } // OFFSET: LEGO1 0x100bcd10 -long MxBitmap::Read(const char *) +long MxBitmap::Read(const char *filename) { - // TODO - return 0; + HANDLE handle; + int unk1; + MxResult ret = FAILURE; + + handle = CreateFileA(filename,GENERIC_READ,FILE_SHARE_READ,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL); + if(handle != (HANDLE)INVALID_HANDLE_VALUE) { // INVALID_HANDLE_VALUE = -1, or 0xffffffff + // FIXME: line 16. iVar gets changed in this line + if(unk1 == 0) { + ret = SUCCESS; + } + } + if(handle != (HANDLE)NULL) { + CloseHandle(handle); + } + + return ret; } + diff --git a/LEGO1/mxbitmap.h b/LEGO1/mxbitmap.h index 1fc54260..24d9e166 100644 --- a/LEGO1/mxbitmap.h +++ b/LEGO1/mxbitmap.h @@ -1,15 +1,26 @@ #ifndef MXBITMAP_H #define MXBITMAP_H -#include "mxpalette.h" +#include -class MxBitmap +#include "mxcore.h" +#include "mxpalette.h" +#include "mxtypes.h" + +class MxBitmap : public MxCore { public: __declspec(dllexport) MxBitmap(); __declspec(dllexport) virtual ~MxBitmap(); __declspec(dllexport) virtual MxPalette *CreatePalette(); __declspec(dllexport) virtual long Read(const char *); +private: + BITMAPINFO *m_info; + BITMAPINFOHEADER *m_bmiHeader; + RGBQUAD *m_paletteData; + LPVOID *m_data; + MxBool m_unk18; + MxPalette *m_palette; }; #endif // MXBITMAP_H From d7b8d6463bcba9b433e8fa61abe7dd1558a6c4c3 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 1 Jul 2023 01:24:46 +0200 Subject: [PATCH 21/34] lego: Implement/match CalculateNewVel (#66) * lego: Implement/match CalculateNewVel * remove braces * consistency --- LEGO1/legonavcontroller.cpp | 36 +++++++++++++++++++++++++----------- LEGO1/legonavcontroller.h | 1 + LEGO1/legoutil.h | 12 ++++++++++++ LEGO1/mxdsobject.cpp | 10 +++++----- 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/LEGO1/legonavcontroller.cpp b/LEGO1/legonavcontroller.cpp index af618de9..90c0a485 100644 --- a/LEGO1/legonavcontroller.cpp +++ b/LEGO1/legonavcontroller.cpp @@ -106,8 +106,7 @@ void LegoNavController::SetControlMax(int p_hMax, int p_vMax) this->m_hMax = p_hMax; this->m_vMax = p_vMax; - if (VideoManager()->GetVideoParam().flags().GetFullScreen()) - { + if (VideoManager()->GetVideoParam().flags().GetFullScreen()) { this->m_hMax = 640; this->m_vMax = 480; } @@ -134,19 +133,15 @@ void LegoNavController::ResetToDefault() void LegoNavController::SetTargets(int p_hPos, int p_vPos, MxBool p_accel) { if (this->m_trackDefault != FALSE) - { ResetToDefault(); - } - if (p_accel != FALSE) - { + if (p_accel != FALSE) { this->m_targetTurnSpeed = CalculateNewTargetSpeed(p_hPos, this->m_hMax / 2, this->m_turnMaxSpeed); this->m_targetMovementSpeed = CalculateNewTargetSpeed(this->m_vMax - p_vPos, this->m_vMax / 2, this->m_movementMaxSpeed); this->m_turnAccel = CalculateNewAccel(p_hPos, this->m_hMax / 2, this->m_turnMaxAccel, (int)this->m_turnMinAccel); this->m_movementAccel = CalculateNewAccel(this->m_vMax - p_vPos, this->m_vMax / 2, this->m_movementMaxAccel, (int)this->m_movementMinAccel); } - else - { + else { this->m_targetTurnSpeed = 0.0f; this->m_targetMovementSpeed = 0.0f; this->m_movementAccel = this->m_movementDecel; @@ -179,9 +174,28 @@ float LegoNavController::CalculateNewAccel(int p_pos, int p_center, float p_maxA result = Abs(diff) * p_maxAccel / p_center; if (result < p_minAccel) - { - result = (float)p_minAccel; - } + result = (float) p_minAccel; return result; } + +// OFFSET: LEGO1 0x10054fe0 +float LegoNavController::CalculateNewVel(float p_targetVel, float p_currentVel, float p_accel, float p_time) +{ + float newVel = p_currentVel; + + float velDiff = p_targetVel - p_currentVel; + int vSign = velDiff > 0 ? 1 : -1; + + if (Abs(velDiff) > this->m_zeroThreshold) { + float deltaVel = p_accel * p_time; + newVel = p_currentVel + (deltaVel * vSign); + + if (vSign > 0) + newVel = Min(newVel, p_targetVel); + else + newVel = Max(newVel, p_targetVel); + } + + return newVel; +} \ No newline at end of file diff --git a/LEGO1/legonavcontroller.h b/LEGO1/legonavcontroller.h index 9bffd7dd..89af9f12 100644 --- a/LEGO1/legonavcontroller.h +++ b/LEGO1/legonavcontroller.h @@ -40,6 +40,7 @@ class LegoNavController : public MxCore void SetTargets(int p_hPos, int p_vPos, MxBool p_accel); float CalculateNewTargetSpeed(int p_pos, int p_center, float p_maxSpeed); float CalculateNewAccel(int p_pos, int p_center, float p_maxAccel, int p_minAccel); + float CalculateNewVel(float p_targetVel, float p_currentVel, float p_accel, float p_time); private: int m_hMax; diff --git a/LEGO1/legoutil.h b/LEGO1/legoutil.h index e94a6440..f0e97ac5 100644 --- a/LEGO1/legoutil.h +++ b/LEGO1/legoutil.h @@ -7,4 +7,16 @@ inline T Abs(T p_t) return p_t < 0 ? -p_t : p_t; } +template +inline T Min(T p_t1, T p_t2) +{ + return p_t1 < p_t2 ? p_t1 : p_t2; +} + +template +inline T Max(T p_t1, T p_t2) +{ + return p_t1 > p_t2 ? p_t1 : p_t2; +} + #endif // LEGOUTIL_H diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index fd4b7434..66b1ed6c 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -45,16 +45,16 @@ MxDSObject &MxDSObject::operator=(MxDSObject &p_dsObject) } // OFFSET: LEGO1 0x100bf8e0 -void MxDSObject::SetObjectName(const char *p_name) +void MxDSObject::SetObjectName(const char *p_objectName) { - if (p_name != this->m_objectName) { + if (p_objectName != this->m_objectName) { delete[] this->m_objectName; - if (p_name) { - this->m_objectName = new char[strlen(p_name) + 1]; + if (p_objectName) { + this->m_objectName = new char[strlen(p_objectName) + 1]; if (this->m_objectName) { - strcpy(this->m_objectName, p_name); + strcpy(this->m_objectName, p_objectName); } } else { From a66dbb8136a718e9217e00acc006ab905441c636 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:33:59 -0700 Subject: [PATCH 22/34] Squashed commit of the following: commit a41a442f5aba5fa2f22efc46e66b055f8e99b04e Author: MishaProductions <106913236+MishaProductions@users.noreply.github.com> Date: Fri Jun 30 08:10:54 2023 +0300 Update .editorconfig Co-authored-by: Anonymous Maarten commit 5768cf4a0cf58778cd1265220936081c43c91769 Author: Misha Date: Fri Jun 30 08:04:37 2023 +0300 add legoutil commit 7d6b00c831d01688749d6cadb8b8ea683d18a52d Author: Misha Date: Fri Jun 30 08:02:17 2023 +0300 Update CMakeLists.txt commit d9b49087f8681a858b7d32b38cc937160b5a5ab0 Author: Misha Date: Fri Jun 30 08:01:06 2023 +0300 Update CMakeLists.txt commit d5a2891965b0e3c992c92e7782c4cc54fc7ae7af Author: Misha Date: Fri Jun 30 07:59:03 2023 +0300 Update CMakeLists.txt commit 519253bff43426d2b4cbb916f0fecba8fd677695 Merge: 6cefa2e 13df3f9 Author: Misha Date: Fri Jun 30 07:57:15 2023 +0300 Merge remote-tracking branch 'upstream/master' into legobackgroundcolor commit 6cefa2e9e259f57033d6e50f9be0af5de6e2df61 Author: Misha Date: Thu Jun 29 16:51:53 2023 +0300 add back stuff to mak file after merge commit c2b16eb8ff2e99b160bf5d5b75df7960da8f2877 Merge: 3c8add2 07912eb Author: Misha Date: Thu Jun 29 16:49:51 2023 +0300 Merge remote-tracking branch 'upstream/master' into legobackgroundcolor commit 3c8add2f1979f1ac2372f06c2025cda4104c2db2 Author: Misha Date: Thu Jun 29 13:34:15 2023 +0300 Update legobackgroundcolor.cpp commit 6879f30e79caaef23319488b729283cda6f46c25 Author: Misha Date: Wed Jun 28 18:22:35 2023 +0300 add fixme + rename MxStringVariable functions commit a883f37b9d67c57bc336812bf83ee85c363f8931 Author: Misha Date: Wed Jun 28 18:15:42 2023 +0300 address review commit a919eeb7f48b31554b8edf499c131f570b1529bf Author: Misha Date: Wed Jun 28 08:19:45 2023 +0300 Update mxbackgroundcolor.cpp commit 710c1dd5ea53212c43e1564480f27370f28ca7e4 Author: Misha Date: Wed Jun 28 08:11:13 2023 +0300 add back mak file commit 25e9bbbfb0d330e70570f59823b2e88f159ad49d Merge: 78b0e8d 2d9af63 Author: Misha Date: Wed Jun 28 08:09:03 2023 +0300 Merge remote-tracking branch 'upstream/master' into legobackgroundcolor commit 78b0e8dd625add18ea9a62dcd72a820e1a0beab5 Author: Misha Date: Tue Jun 27 18:35:58 2023 +0300 improve accuracy commit 4c2e1ca95c4463da20266f61299370fa0ecda9f4 Author: Misha Date: Mon Jun 26 13:50:40 2023 +0300 improve accuracy commit 7dd3469ca330254e0177c838991b9436bb3c90c2 Author: Misha Date: Mon Jun 26 13:24:11 2023 +0300 ConvertColor wip commit b0288803a834a9e4f41486bb60c81935b94a4cd2 Merge: 3d16867 0b47f3f Author: MishaProductions <106913236+MishaProductions@users.noreply.github.com> Date: Mon Jun 26 09:42:08 2023 +0300 Merge branch 'isledecomp:master' into legobackgroundcolor commit 3d16867a901862d66aec632e269061c81e7d443d Author: Misha Date: Sun Jun 25 17:03:14 2023 +0300 90% match commit 2208573eb2cf73465c2a5b49a63db66dd8f6f841 Author: Misha Date: Sun Jun 25 12:23:47 2023 +0300 improve accuracy + add editorconfig commit 288f8614281788fd3a19f07a7732b06337253e34 Author: Misha Date: Sun Jun 25 07:57:14 2023 +0300 fix makefile commit 3590e59a3a9f021b0de3833e80d320238255bc46 Author: Misha Date: Sun Jun 25 07:51:35 2023 +0300 Update isle.mak commit fb52ad57813214a8af9ef21fdb9ef39005961778 Author: Misha Date: Sun Jun 25 07:47:06 2023 +0300 fix build commit 791cf1301af1e194025908d8812edaa4faf0f3cf Merge: b9ecd15 64d2b9e Author: Misha Date: Sun Jun 25 07:42:09 2023 +0300 Merge remote-tracking branch 'upstream/master' into legobackgroundcolor commit b9ecd15ca60b6d4c26fe10405e80b08bbf02d62e Author: Misha Date: Sun Jun 25 07:40:22 2023 +0300 undo change commit 6327a797bce26c277c21c71e5ec56a446f227aa5 Author: Misha Date: Sat Jun 24 21:48:08 2023 +0300 delete accidently committed files commit 7ae1c05df962ff64029c3264aaf824801a3055cc Author: Misha Date: Sat Jun 24 21:47:05 2023 +0300 implement SetColorString commit 323a2ee0e7a4c767d80535f2f0e3a8036124da05 Author: Misha Date: Sat Jun 24 20:47:03 2023 +0300 constructor and some methods are matching commit 0ce6fab3d085b2e2e68c95bdff59557c483486fe Author: Misha Date: Sat Jun 24 20:38:10 2023 +0300 constructor is almost matching --- .editorconfig | 7 ++++ CMakeLists.txt | 3 ++ LEGO1/legobackgroundcolor.cpp | 53 +++++++++++++++++++++++++-- LEGO1/legobackgroundcolor.h | 11 ++++-- LEGO1/legoutil.cpp | 68 +++++++++++++++++++++++++++++++++++ LEGO1/legoutil.h | 2 ++ LEGO1/legovideomanager.cpp | 13 +++++++ LEGO1/legovideomanager.h | 1 + LEGO1/mxstringvariable.cpp | 23 ++++++++++++ LEGO1/mxstringvariable.h | 20 +++++++++++ 10 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 .editorconfig create mode 100644 LEGO1/legoutil.cpp create mode 100644 LEGO1/mxstringvariable.cpp create mode 100644 LEGO1/mxstringvariable.h diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..937b347f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true +[*.{cpp,h,py,txt,editorconfig}] + +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c5900ac..e7b584d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ add_library(lego1 SHARED LEGO1/legoanimmmpresenter.cpp LEGO1/legoanimpresenter.cpp LEGO1/legobackgroundcolor.cpp + LEGO1/legobackgroundcolor.cpp LEGO1/legobuildingmanager.cpp LEGO1/legocachesound.cpp LEGO1/legocameracontroller.cpp @@ -80,6 +81,7 @@ add_library(lego1 SHARED LEGO1/legosoundmanager.cpp LEGO1/legostate.cpp LEGO1/legotexturepresenter.cpp + LEGO1/legoutil.cpp LEGO1/legovideomanager.cpp LEGO1/legoworld.cpp LEGO1/legoworldpresenter.cpp @@ -136,6 +138,7 @@ add_library(lego1 SHARED LEGO1/mxstillpresenter.cpp LEGO1/mxstreamer.cpp LEGO1/mxstring.cpp + LEGO1/mxstringvariable.cpp LEGO1/mxtimer.cpp LEGO1/mxtransitionmanager.cpp LEGO1/mxunknown100dc6b0.cpp diff --git a/LEGO1/legobackgroundcolor.cpp b/LEGO1/legobackgroundcolor.cpp index 17d24108..b818267f 100644 --- a/LEGO1/legobackgroundcolor.cpp +++ b/LEGO1/legobackgroundcolor.cpp @@ -1,7 +1,56 @@ #include "legobackgroundcolor.h" +#include "legoomni.h" +#include "legoutil.h" +#include "legovideomanager.h" + +const char *Delimiter = "\t"; +const char *set = "set"; +const char *reset = "reset"; + // OFFSET: LEGO1 0x1003bfb0 -LegoBackgroundColor::LegoBackgroundColor(const char *, const char *) +LegoBackgroundColor::LegoBackgroundColor(const char *name, const char *colorString) { - // TODO + m_name = name; + m_name.ToUpperCase(); + SetColorString(colorString); +} + +// OFFSET: LEGO1 0x1003c070 +void LegoBackgroundColor::SetColorString(const char *colorString) +{ + m_name = colorString; + m_string.ToLowerCase(); + + float converted_r; + float converted_b; + float converted_g; + LegoVideoManager *videomanager = VideoManager(); + + if (videomanager && colorString) + { + int length = strlen(colorString) + 1; + char *colorStringCopy = new char[length]; + strcpy(colorStringCopy, colorString); + char *colorStringSplit = strtok(colorStringCopy, Delimiter); + if (!strcmp(colorStringSplit, set)) + { + char *hue = strtok(0, Delimiter); + if (hue) + h = atoi(hue) * 0.01; + char *sat = strtok(0, Delimiter); + if (sat) + s = atoi(sat) * 0.01; + char *val = strtok(0, Delimiter); + if (val) + v = atoi(val) * 0.01; + } + else if (!strcmp(colorStringSplit, reset)) + { + // reset it + ConvertHSVToRGB(this->h, this->s, this->v, &converted_r, &converted_g, &converted_b); + videomanager->SetSkyColor(converted_r, converted_g, converted_b); + } + delete[] colorStringCopy; + } } diff --git a/LEGO1/legobackgroundcolor.h b/LEGO1/legobackgroundcolor.h index c660c0bf..812e8882 100644 --- a/LEGO1/legobackgroundcolor.h +++ b/LEGO1/legobackgroundcolor.h @@ -1,10 +1,17 @@ #ifndef LEGOBACKGROUNDCOLOR_H #define LEGOBACKGROUNDCOLOR_H - -class LegoBackgroundColor +#include "mxstring.h" +#include "mxcore.h" +#include "MxStringVariable.h" +class LegoBackgroundColor : public MxStringVariable { public: __declspec(dllexport) LegoBackgroundColor(const char *, const char *); + void SetColorString(const char *colorString); +protected: + float h; + float s; + float v; }; #endif // LEGOBACKGROUNDCOLOR_H diff --git a/LEGO1/legoutil.cpp b/LEGO1/legoutil.cpp new file mode 100644 index 00000000..58e11e8f --- /dev/null +++ b/LEGO1/legoutil.cpp @@ -0,0 +1,68 @@ +#include "legoutil.h" + +// OFFSET: LEGO1 0x1003eae0 +void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out) +{ + double calc; + double p; + long hue_index; + double v9; + double v12; + double v13; + if (s > 0.5f) + calc = (1.0f - v) * s + v; + else + calc = (v + 1.0) * s; + if (calc <= 0.0) + { + *g_out = 0.0f; + *b_out = 0.0f; + *r_out = 0.0f; + return; + } + p = s * 2.0 - calc; + hue_index = h * 6.0; + v9 = (h * 6.0 - (float)hue_index) * ((calc - p) / calc) * calc; + v12 = p + v9; + v13 = calc - v9; + switch (hue_index) + { + case 0: + *r_out = calc; + *b_out = v12; + *g_out = p; + break; + case 1: + *r_out = v13; + *b_out = calc; + *g_out = p; + break; + case 2: + *r_out = p; + *b_out = calc; + *g_out = v12; + break; + case 3: + *r_out = p; + *b_out = v13; + *g_out = calc; + break; + case 4: + *r_out = v12; + *b_out = p; + *g_out = calc; + break; + case 5: + *r_out = calc; + *b_out = p; + *g_out = v13; + break; + case 6: + *r_out = calc; + *b_out = p; + *g_out = v13; + break; + default: + return; + } +} \ No newline at end of file diff --git a/LEGO1/legoutil.h b/LEGO1/legoutil.h index f0e97ac5..6a0113e8 100644 --- a/LEGO1/legoutil.h +++ b/LEGO1/legoutil.h @@ -19,4 +19,6 @@ inline T Max(T p_t1, T p_t2) return p_t1 > p_t2 ? p_t1 : p_t2; } +void ConvertHSVToRGB(float r, float g, float b, float* out_r, float* out_g, float* out_b); + #endif // LEGOUTIL_H diff --git a/LEGO1/legovideomanager.cpp b/LEGO1/legovideomanager.cpp index 060cc61f..9c1044e2 100644 --- a/LEGO1/legovideomanager.cpp +++ b/LEGO1/legovideomanager.cpp @@ -1,4 +1,5 @@ #include "legovideomanager.h" +#include // OFFSET: LEGO1 0x1007aa20 STUB LegoVideoManager::LegoVideoManager() @@ -37,3 +38,15 @@ void LegoVideoManager::MoveCursor(int x, int y) { // TODO } + +// OFFSET: LEGO1 0x1007c440 +void LegoVideoManager::SetSkyColor(float red, float green, float blue) +{ + PALETTEENTRY colorStrucure; // [esp+0h] [ebp-4h] BYREF + + colorStrucure.peRed = (red* 255.0); + colorStrucure.peGreen = (green * 255.0); + colorStrucure.peBlue = (blue * 255.0); + colorStrucure.peFlags = -124; + // TODO +} diff --git a/LEGO1/legovideomanager.h b/LEGO1/legovideomanager.h index ec1aa6fd..379ec468 100644 --- a/LEGO1/legovideomanager.h +++ b/LEGO1/legovideomanager.h @@ -18,6 +18,7 @@ class LegoVideoManager : public MxVideoManager __declspec(dllexport) void MoveCursor(int x, int y); inline Lego3DManager *Get3DManager() { return this->m_3dManager; } + void SetSkyColor(float r, float g, float b); int m_unk64; Lego3DManager *m_3dManager; diff --git a/LEGO1/mxstringvariable.cpp b/LEGO1/mxstringvariable.cpp new file mode 100644 index 00000000..a9432679 --- /dev/null +++ b/LEGO1/mxstringvariable.cpp @@ -0,0 +1,23 @@ +#include "MxStringVariable.h" +#include "mxstring.h" + +//FIXME: Figure out what exactly this class is used for. It is used in LegoGameState::LegoGameState when loading the background color, and for loading the "fsmovie" variable +// OFFSET: LEGO1 0x1003bec0 +MxStringVariable::~MxStringVariable() +{ + + delete &m_string; + delete &m_name; +} + +// OFFSET: LEGO1 0x1003bea0 +MxString *MxStringVariable::GetString() +{ + return &m_string; +} + +// OFFSET: LEGO1 0x1003beb0 +void MxStringVariable::SetString(const char *colorString) +{ + m_string = colorString; +} diff --git a/LEGO1/mxstringvariable.h b/LEGO1/mxstringvariable.h new file mode 100644 index 00000000..5284fc5d --- /dev/null +++ b/LEGO1/mxstringvariable.h @@ -0,0 +1,20 @@ +#ifndef MXSTRINGVARIABLE_H +#define MXSTRINGVARIABLE_H +#include "mxstring.h" +#include "mxcore.h" +//VTABLE: 0x100d74a8 +class MxStringVariable +{ +public: + __declspec(dllexport) MxStringVariable(const char *, const char *); + MxStringVariable() {} + virtual MxString *GetString(); + virtual void SetString(const char *colorString); + virtual ~MxStringVariable(); + +protected: + MxString m_name; + MxString m_string; +}; + +#endif // MXSTRINGVARIABLE_H From 8aad15d18bb9421d70114872403d9a58626e3030 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 2 Jul 2023 06:49:42 +0200 Subject: [PATCH 23/34] lego1: match MxBitmap::Read and vtable (#67) * lego1: match MxBitmap::Read and vtable * fix param name --- LEGO1/mxbitmap.cpp | 103 ++++++++++++++++++++++++++++++++++----------- LEGO1/mxbitmap.h | 18 ++++++-- 2 files changed, 94 insertions(+), 27 deletions(-) diff --git a/LEGO1/mxbitmap.cpp b/LEGO1/mxbitmap.cpp index a7425dd8..2ccdd80b 100644 --- a/LEGO1/mxbitmap.cpp +++ b/LEGO1/mxbitmap.cpp @@ -14,15 +14,75 @@ MxBitmap::MxBitmap() // OFFSET: LEGO1 0x100bca10 MxBitmap::~MxBitmap() { - if (this->m_info != NULL) { + if (this->m_info != NULL) delete m_info; - } - if (this->m_data != NULL) { + if (this->m_data != NULL) delete m_data; - } - if (this->m_palette != NULL) { + if (this->m_palette != NULL) delete m_palette; - } +} + +// OFFSET: LEGO1 0x100bcc40 STUB +int MxBitmap::vtable14(int) +{ + return 0; +} + +// OFFSET: LEGO1 0x100bcba0 STUB +int MxBitmap::vtable18(BITMAPINFOHEADER *p_bmiHeader) +{ + return 0; +} + +// OFFSET: LEGO1 0x100bcaa0 STUB +int MxBitmap::vtable1c(int p_width, int p_height, MxPalette *p_palette, int) +{ + return 0; +} + +// OFFSET: LEGO1 0x100bcd60 STUB +MxResult MxBitmap::LoadFile(HANDLE p_handle) +{ + return SUCCESS; +} + +// OFFSET: LEGO1 0x100bcd10 +long MxBitmap::Read(const char *p_filename) +{ + MxResult result = FAILURE; + HANDLE handle = CreateFileA( + p_filename, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + + if (handle != INVALID_HANDLE_VALUE && !LoadFile(handle)) + result = SUCCESS; + + if (handle) + CloseHandle(handle); + + return result; +} + +// OFFSET: LEGO1 0x1004e0d0 +int MxBitmap::vtable28(int) +{ + return -1; +} + +// OFFSET: LEGO1 0x100ce70 STUB +void MxBitmap::vtable2c(int, int, int, int, int, int, int) +{ +} + +// OFFSET: LEGO1 0x100d020 STUB +void MxBitmap::vtable30(int, int, int, int, int, int, int) +{ } // OFFSET: LEGO1 0x100bd1c0 @@ -51,24 +111,19 @@ MxPalette *MxBitmap::CreatePalette() return pal; } -// OFFSET: LEGO1 0x100bcd10 -long MxBitmap::Read(const char *filename) +// OFFSET: LEGO1 0x100bd280 STUB +void MxBitmap::vtable38(void*) { - HANDLE handle; - int unk1; - MxResult ret = FAILURE; - - handle = CreateFileA(filename,GENERIC_READ,FILE_SHARE_READ,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL); - if(handle != (HANDLE)INVALID_HANDLE_VALUE) { // INVALID_HANDLE_VALUE = -1, or 0xffffffff - // FIXME: line 16. iVar gets changed in this line - if(unk1 == 0) { - ret = SUCCESS; - } - } - if(handle != (HANDLE)NULL) { - CloseHandle(handle); - } - - return ret; } +// OFFSET: LEGO1 0x100bd2d0 STUB +int MxBitmap::vtable3c(MxBool) +{ + return 0; +} + +// OFFSET: LEGO1 0x100bd3e0 STUB +int MxBitmap::vtable40(HDC p_hdc, int p_xSrc, int p_ySrc, int p_xDest, int p_yDest, int p_destWidth, int p_destHeight) +{ + return 0; +} \ No newline at end of file diff --git a/LEGO1/mxbitmap.h b/LEGO1/mxbitmap.h index 24d9e166..e16fcb0e 100644 --- a/LEGO1/mxbitmap.h +++ b/LEGO1/mxbitmap.h @@ -11,9 +11,21 @@ class MxBitmap : public MxCore { public: __declspec(dllexport) MxBitmap(); - __declspec(dllexport) virtual ~MxBitmap(); - __declspec(dllexport) virtual MxPalette *CreatePalette(); - __declspec(dllexport) virtual long Read(const char *); + __declspec(dllexport) virtual ~MxBitmap(); // vtable+00 + + virtual int vtable14(int); + virtual int vtable18(BITMAPINFOHEADER *p_bmiHeader); + virtual int vtable1c(int p_width, int p_height, MxPalette *p_palette, int); + virtual MxResult LoadFile(HANDLE p_handle); + __declspec(dllexport) virtual long Read(const char *p_filename); // vtable+24 + virtual int vtable28(int); + virtual void vtable2c(int, int, int, int, int, int, int); + virtual void vtable30(int, int, int, int, int, int, int); + __declspec(dllexport) virtual MxPalette *CreatePalette(); // vtable+34 + virtual void vtable38(void*); + virtual int vtable3c(MxBool); + virtual int vtable40(HDC p_hdc, int p_xSrc, int p_ySrc, int p_xDest, int p_yDest, int p_destWidth, int p_destHeight); + private: BITMAPINFO *m_info; BITMAPINFOHEADER *m_bmiHeader; From 904640e028e7aa00b17c730887cfce070801cc66 Mon Sep 17 00:00:00 2001 From: stonedDiscord Date: Sun, 2 Jul 2023 06:51:26 +0200 Subject: [PATCH 24/34] CI steps (#65) * break build up into steps * download artifacts * clone uploadtool * need env on windows * just use ubuntu for inkscape * report went missing * add inkscape to path * use ubuntu for compare * Revert "use ubuntu for compare" This reverts commit a4ce103d091185471bcd629f6dfa6d1ab97829eb. * reinstall after cache * try different apt cache * use im * use rsvg * change size to avoid downscaling * remove png * do not install librsvg anymore --- .github/workflows/build.yml | 58 ++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 09bf06a2..3bbc6d50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,10 +1,6 @@ name: Build -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] +on: [push, pull_request] jobs: build: @@ -61,6 +57,27 @@ jobs: cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -G "NMake Makefiles" cmake --build . + - name: Upload Artifact + uses: actions/upload-artifact@master + with: + name: Win32 + path: | + build/ISLE.EXE + build/ISLE.PDB + build/LEGO1.DLL + build/LEGO1.PDB + + compare: + needs: build + runs-on: windows-latest + steps: + - uses: actions/checkout@master + + - uses: actions/download-artifact@master + with: + name: Win32 + path: build + - name: Restore cached original binaries id: cache-original-binaries uses: actions/cache/restore@v3 @@ -103,14 +120,6 @@ jobs: run: | python3 tools/verexp/verexp.py legobin/LEGO1.DLL build/LEGO1.DLL - - name: Upload Artifact - uses: actions/upload-artifact@master - with: - name: Win32 - path: | - build/ISLE.EXE - build/LEGO1.DLL - - name: Upload Artifact uses: actions/upload-artifact@master with: @@ -118,15 +127,30 @@ jobs: path: | ISLEPROGRESS.* LEGO1PROGRESS.* - + + upload: + needs: [build, compare] + runs-on: ubuntu-latest + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + steps: + - uses: actions/checkout@v3 + with: + repository: 'probonopd/uploadtool' + + - uses: actions/download-artifact@master + with: + name: Win32 + path: build + + - uses: actions/download-artifact@master + with: + name: Accuracy Report + - name: Upload Continuous Release - shell: bash - if: github.event_name == 'push' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} UPLOAD_KEY: ${{ secrets.UPLOAD_KEY }} run: | - curl -fLOSs https://raw.githubusercontent.com/probonopd/uploadtool/master/upload.sh ./upload.sh \ build/ISLE.EXE \ build/LEGO1.DLL \ From 40dd0a93d473400f55cc2377c613eb469a0944ba Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Sun, 2 Jul 2023 08:52:47 +0200 Subject: [PATCH 25/34] Faster reccmp.py on linux (#62) * reccmp: avoid repeated execution of winepath Executing winepath many times is slow, so try we like to avoid it as much as possible. When the path start with a known prefix, replace it with a cached prefix and do some string manipulation. This change reduces execution time of reccmp.py from 90s to 2s. Which is nice. m * reccmp: continue looking when source cannot be found Most often, the reasons is mismatched sources. * reccmp: add basic logging + optional debug * Read the addresses in the exe headers as little endian --- tools/reccmp/reccmp.py | 93 ++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 27 deletions(-) diff --git a/tools/reccmp/reccmp.py b/tools/reccmp/reccmp.py index abfe71a7..226be15d 100755 --- a/tools/reccmp/reccmp.py +++ b/tools/reccmp/reccmp.py @@ -6,6 +6,7 @@ import difflib import struct import subprocess +import logging import os import sys import colorama @@ -24,8 +25,14 @@ parser.add_argument('--svg-icon', metavar='icon', help='Icon to use in SVG (PNG)') parser.add_argument('--print-rec-addr', action='store_true', help='Print addresses of recompiled functions too') +parser.set_defaults(loglevel=logging.INFO) +parser.add_argument('--debug', action='store_const', const=logging.DEBUG, dest='loglevel', help='Print script debug information') + args = parser.parse_args() +logging.basicConfig(level=args.loglevel, format='[%(levelname)s] %(message)s') +logger = logging.getLogger(__name__) + colorama.init() verbose = None @@ -61,6 +68,7 @@ # to file addresses class Bin: def __init__(self, filename): + logger.debug('Parsing headers of "%s"... ', filename) self.file = open(filename, 'rb') #HACK: Strictly, we should be parsing the header, but we know where @@ -68,15 +76,16 @@ def __init__(self, filename): # Read ImageBase self.file.seek(0xB4) - self.imagebase = struct.unpack('i', self.file.read(4))[0] + self.imagebase, = struct.unpack(' str: + if unix_fn.startswith('./'): + return self.win_cmd + '\\' + unix_fn[2:].replace('/', '\\') + if unix_fn.startswith(self.unix_cwd): + return self.win_cwd + '\\' + unix_fn.removeprefix(self.unix_cwd).replace('/', '\\').lstrip('\\') + return self._call_winepath_unix2win(unix_fn) + + def get_unix_path(self, win_fn: str) -> str: + if win_fn.startswith('.\\') or win_fn.startswith('./'): + return self.unix_cwd + '/' + win_fn[2:].replace('\\', '/') + if win_fn.startswith(self.win_cwd): + return self.unix_cwd + '/' + win_fn.removeprefix(self.win_cwd).replace('\\', '/') + return self._call_winepath_win2unix(win_fn) + + @staticmethod + def _call_winepath_unix2win(fn: str) -> str: + return subprocess.check_output(['winepath', '-w', fn], text=True).strip() + + @staticmethod + def _call_winepath_win2unix(fn: str) -> str: + return subprocess.check_output(['winepath', fn], text=True).strip() def get_file_in_script_dir(fn): return os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), fn) @@ -109,22 +140,24 @@ class SymInfo: funcs = {} lines = {} - def __init__(self, pdb, file): + def __init__(self, pdb, file, wine_path_converter): call = [get_file_in_script_dir('cvdump.exe'), '-l', '-s'] - if os.name != 'nt': + if wine_path_converter: # Run cvdump through wine and convert path to Windows-friendly wine path call.insert(0, 'wine') - call.append(get_wine_path(pdb)) + call.append(wine_path_converter.get_wine_path(pdb)) else: call.append(pdb) - print('Parsing %s...' % pdb) - + logger.info('Parsing %s ...', pdb) + logger.debug('Command = %r', call) line_dump = subprocess.check_output(call).decode('utf-8').split('\r\n') current_section = None + logger.debug('Parsing output of cvdump.exe ...') + for i, line in enumerate(line_dump): if line.startswith('***'): current_section = line[4:] @@ -132,8 +165,6 @@ def __init__(self, pdb, file): if current_section == 'SYMBOLS' and 'S_GPROC32' in line: addr = int(line[26:34], 16) - - info = RecompiledInfo() info.addr = addr + recompfile.imagebase + recompfile.textvirt @@ -155,9 +186,9 @@ def __init__(self, pdb, file): elif current_section == 'LINES' and line.startswith(' ') and not line.startswith(' '): sourcepath = line.split()[0] - if os.name != 'nt': + if wine_path_converter: # Convert filename to Unix path for file compare - sourcepath = get_unix_path(sourcepath) + sourcepath = wine_path_converter.get_unix_path(sourcepath) if sourcepath not in self.lines: self.lines[sourcepath] = {} @@ -178,18 +209,23 @@ def __init__(self, pdb, file): j += 1 + logger.debug('... Parsing output of cvdump.exe finished') + def get_recompiled_address(self, filename, line): addr = None found = False - #print('Looking for ' + filename + ' line ' + str(line)) + logger.debug('Looking for %s:%d', filename, line) for fn in self.lines: # Sometimes a PDB is compiled with a relative path while we always have # an absolute path. Therefore we must - if os.path.samefile(fn, filename): - filename = fn - break + try: + if os.path.samefile(fn, filename): + filename = fn + break + except FileNotFoundError as e: + continue if filename in self.lines and line in self.lines[fn]: addr = self.lines[fn][line] @@ -197,13 +233,16 @@ def get_recompiled_address(self, filename, line): if addr in self.funcs: return self.funcs[addr] else: - print('Failed to find function symbol with address: %s' % hex(addr)) + logger.error('Failed to find function symbol with address: 0x%x', addr) else: - print('Failed to find function symbol with filename and line: %s:%s' % (filename, str(line))) + logger.error('Failed to find function symbol with filename and line: %s:%d', filename, line) +wine_path_converter = None +if os.name != 'nt': + wine_path_converter = WinePathConverter(source) origfile = Bin(original) recompfile = Bin(recomp) -syminfo = SymInfo(syms, recompfile) +syminfo = SymInfo(syms, recompfile, wine_path_converter) print() From 302b3f66f09133bd8feaff24992ffbd4e986211b Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Sun, 2 Jul 2023 08:53:54 +0200 Subject: [PATCH 26/34] Get Isle building on MinGW32 (#63) * Add MxUnknown100dc6b0::~MxUnknown100dc6b0 stub * Declare destructor of MxOmni and MxTransitionManager in class * inline attribute must go first * Stub LegoState::Vtable0x14 for Act3State * MxStreamer::VTable0x14 is not an override * Stub MxEntity::Destroy for LegoState::Destroy * Stub MxUnknown100dc6e0 for MxSoundManager * ::ClassName and ::IsA are const methods * methods in the class body don't need a namespace * MxSoundManager subclasses MxUnknown100dc6e0 * LegoInputManager subclasses MxPresenter * NotificationId is an enum, and does not need __declspec(dllexport) * Fix final #endif of legoomni.h and mxobjectfactory.h * Add const alternative for LegoOmni::Create and MxVideoParam, only available for MinGW * Alternative approach to MinGW compatibility * MinGW on Linux is case sensitve * Don't delete a member variable. C++ automatically destructs member variables --------- Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com> --- CMakeLists.txt | 1 + LEGO1/act2brick.h | 6 +++--- LEGO1/compat.h | 14 ++++++++++++++ LEGO1/legobackgroundcolor.h | 3 ++- LEGO1/legoinputmanager.h | 8 ++++---- LEGO1/legoomni.cpp | 2 +- LEGO1/legoomni.h | 3 ++- LEGO1/legostate.cpp | 5 +++++ LEGO1/legostate.h | 4 +++- LEGO1/mxentity.cpp | 6 ++++++ LEGO1/mxentity.h | 2 ++ LEGO1/mxmediapresenter.h | 4 ++-- LEGO1/mxobjectfactory.h | 2 +- LEGO1/mxomni.h | 5 +++-- LEGO1/mxsoundmanager.cpp | 12 ++++++++++-- LEGO1/mxsoundmanager.h | 8 ++++++-- LEGO1/mxstreamer.h | 2 +- LEGO1/mxstringvariable.cpp | 17 ++++++++--------- LEGO1/mxstringvariable.h | 2 +- LEGO1/mxtimer.h | 2 +- LEGO1/mxtransitionmanager.h | 3 ++- LEGO1/mxunknown100dc6b0.cpp | 6 ++++++ LEGO1/mxunknown100dc6b0.h | 1 + LEGO1/mxunknown100dc6e0.cpp | 19 +++++++++++++++++++ LEGO1/mxunknown100dc6e0.h | 19 +++++++++++++++++++ LEGO1/mxvideoparam.cpp | 2 +- LEGO1/mxvideoparam.h | 3 ++- 27 files changed, 126 insertions(+), 35 deletions(-) create mode 100644 LEGO1/compat.h create mode 100644 LEGO1/mxunknown100dc6e0.cpp create mode 100644 LEGO1/mxunknown100dc6e0.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e7b584d9..4d4976fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,6 +142,7 @@ add_library(lego1 SHARED LEGO1/mxtimer.cpp LEGO1/mxtransitionmanager.cpp LEGO1/mxunknown100dc6b0.cpp + LEGO1/mxunknown100dc6e0.cpp LEGO1/mxvariabletable.cpp LEGO1/mxvideomanager.cpp LEGO1/mxvideoparam.cpp diff --git a/LEGO1/act2brick.h b/LEGO1/act2brick.h index d5703081..fd10a997 100644 --- a/LEGO1/act2brick.h +++ b/LEGO1/act2brick.h @@ -8,21 +8,21 @@ class Act2Brick : public LegoPathActor { public: - Act2Brick(); + Act2Brick(); virtual ~Act2Brick() override; // vtable+0x0 virtual long Notify(MxParam &p) override; // vtable+0x4 virtual long Tickle() override; // vtable+0x08 // OFFSET: LEGO1 0x1007a360 - inline virtual const char *ClassName() override // vtable+0x0c + inline virtual const char *ClassName() const override // vtable+0x0c { // 0x100f0438 return "Act2Brick"; } // OFFSET: LEGO1 0x1007a370 - inline virtual MxBool IsA(const char *name) override // vtable+0x10 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 { return !strcmp(Act2Brick::ClassName(), name) || LegoEntity::IsA(name); } diff --git a/LEGO1/compat.h b/LEGO1/compat.h new file mode 100644 index 00000000..496fa4db --- /dev/null +++ b/LEGO1/compat.h @@ -0,0 +1,14 @@ +#ifndef ISLECOMPAT_H +#define ISLECOMPAT_H + +// Various macros to enable compiling with other/newer compilers. + +// Use `COMPAT_CONST` where something ought to be 'const', and a newer compiler would complain if it +// wasn't, but we know it isn't 'const' in the original code. +#ifdef __MINGW32__ +#define COMPAT_CONST const +#else +#define COMPAT_CONST +#endif + +#endif // ISLECOMPAT_H \ No newline at end of file diff --git a/LEGO1/legobackgroundcolor.h b/LEGO1/legobackgroundcolor.h index 812e8882..1daa6311 100644 --- a/LEGO1/legobackgroundcolor.h +++ b/LEGO1/legobackgroundcolor.h @@ -2,7 +2,8 @@ #define LEGOBACKGROUNDCOLOR_H #include "mxstring.h" #include "mxcore.h" -#include "MxStringVariable.h" +#include "mxstringvariable.h" + class LegoBackgroundColor : public MxStringVariable { public: diff --git a/LEGO1/legoinputmanager.h b/LEGO1/legoinputmanager.h index caafed52..c629134e 100644 --- a/LEGO1/legoinputmanager.h +++ b/LEGO1/legoinputmanager.h @@ -1,9 +1,9 @@ #ifndef LEGOINPUTMANAGER_H #define LEGOINPUTMANAGER_H -#include "mxcore.h" +#include "mxpresenter.h" -__declspec(dllexport) enum NotificationId +enum NotificationId { NONE = 0, KEYDOWN = 7, @@ -15,7 +15,7 @@ __declspec(dllexport) enum NotificationId // VTABLE 0x100d8760 // SIZE 0x338 -class LegoInputManager +class LegoInputManager : public MxPresenter { public: LegoInputManager(); @@ -27,7 +27,7 @@ class LegoInputManager virtual long Tickle() override; // vtable+0x8 - char m_pad00[0x19C]; + char m_pad00[0x15c]; int m_joystickIndex; char m_pad200[0x194]; MxBool m_useJoystick; diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 365748e7..45f7a9f7 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -176,7 +176,7 @@ void LegoOmni::Init() } // OFFSET: LEGO1 0x10058e70 -MxResult LegoOmni::Create(MxOmniCreateParam &p) +MxResult LegoOmni::Create(COMPAT_CONST MxOmniCreateParam &p) { // FIXME: Stub return SUCCESS; diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 9d825ebc..512fba41 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -1,6 +1,7 @@ #ifndef LEGOOMNI_H #define LEGOOMNI_H +#include "compat.h" #include "legoentity.h" #include "legoinputmanager.h" #include "legogamestate.h" @@ -51,7 +52,7 @@ class LegoOmni : public MxOmni } virtual void Init(); // vtable+14 - virtual MxResult Create(MxOmniCreateParam &p); // vtable+18 + virtual MxResult Create(COMPAT_CONST MxOmniCreateParam &p); // vtable+18 virtual void Destroy(); // vtable+1c virtual void vtable20(); virtual void vtable24(MxDSAction &ds); diff --git a/LEGO1/legostate.cpp b/LEGO1/legostate.cpp index 2b49fcd7..55637dc4 100644 --- a/LEGO1/legostate.cpp +++ b/LEGO1/legostate.cpp @@ -4,3 +4,8 @@ LegoState::~LegoState() { } + +// OFFSET: LEGO1 0x10005f90 +MxBool LegoState::VTable0x14() { + return TRUE; +} diff --git a/LEGO1/legostate.h b/LEGO1/legostate.h index be7289bc..904ad323 100644 --- a/LEGO1/legostate.h +++ b/LEGO1/legostate.h @@ -11,7 +11,7 @@ class LegoState : public MxCore // OFFSET: LEGO1 0x100060d0 inline virtual const char *ClassName() const override // vtable+0x0c - { + { // 0x100f01b8 return "LegoState"; } @@ -22,6 +22,8 @@ class LegoState : public MxCore return !strcmp(name, LegoState::ClassName()) || MxCore::IsA(name); } + virtual MxBool VTable0x14(); + }; #endif // LEGOSTATE_H diff --git a/LEGO1/mxentity.cpp b/LEGO1/mxentity.cpp index 526a03e2..7459dd24 100644 --- a/LEGO1/mxentity.cpp +++ b/LEGO1/mxentity.cpp @@ -11,3 +11,9 @@ MxEntity::~MxEntity() { // TODO } + +// OFFSET: LEGO1 0x10001070 STUB +void MxEntity::Destroy() +{ + // TODO +} diff --git a/LEGO1/mxentity.h b/LEGO1/mxentity.h index dda04646..7123abbf 100644 --- a/LEGO1/mxentity.h +++ b/LEGO1/mxentity.h @@ -23,6 +23,8 @@ class MxEntity : public MxCore return !strcmp(name, MxEntity::ClassName()) || MxCore::IsA(name); } + virtual void Destroy(); // vtable+0x1c + // 0x8: MxResult // 0xc MxAtomId }; diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h index 3fb70d31..647150c4 100644 --- a/LEGO1/mxmediapresenter.h +++ b/LEGO1/mxmediapresenter.h @@ -15,14 +15,14 @@ class MxMediaPresenter : public MxPresenter virtual long Tickle() override; // vtable+0x8, override MxCore // OFFSET: LEGO1 0x1000c5c0 - inline virtual const char *MxMediaPresenter::ClassName() const override // vtable+0xc + inline virtual const char *ClassName() const override // vtable+0xc { // 0x100f074c return "MxMediaPresenter"; } // OFFSET: LEGO1 0x1000c5d0 - inline virtual MxBool MxMediaPresenter::IsA(const char *name) const override // vtable+0x10 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 { return !strcmp(name, MxMediaPresenter::ClassName()) || MxPresenter::IsA(name); } diff --git a/LEGO1/mxobjectfactory.h b/LEGO1/mxobjectfactory.h index 57809be9..bdd172a8 100644 --- a/LEGO1/mxobjectfactory.h +++ b/LEGO1/mxobjectfactory.h @@ -9,4 +9,4 @@ class MxObjectFactory : public MxCore }; -#endif MXOBJECTFACTORY_H +#endif // MXOBJECTFACTORY_H diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 0e837ad1..dee03229 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -28,8 +28,9 @@ class MxOmni : public MxCore __declspec(dllexport) static void SetCD(const char *p_cd); __declspec(dllexport) static void SetHD(const char *p_hd); __declspec(dllexport) static void SetSound3D(MxBool p_3dsound); - - virtual ~MxOmni(); + + MxOmni(); + virtual ~MxOmni() override; virtual long Notify(MxParam &p); // vtable+04 virtual void Init(); // vtable+14 diff --git a/LEGO1/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp index d12ecee1..275d0514 100644 --- a/LEGO1/mxsoundmanager.cpp +++ b/LEGO1/mxsoundmanager.cpp @@ -1,9 +1,9 @@ #include "mxsoundmanager.h" -// OFFSET: LEGO1 0x100ae740 STUB +// OFFSET: LEGO1 0x100ae740 MxSoundManager::MxSoundManager() { - // TODO + Init(); } // OFFSET: LEGO1 0x100ae7d0 STUB @@ -11,3 +11,11 @@ MxSoundManager::~MxSoundManager() { // TODO } + +// OFFSET: LEGO1 0x100ae830 +void MxSoundManager::Init() +{ + m_unk30 = 0; + m_unk34 = 0; +} + diff --git a/LEGO1/mxsoundmanager.h b/LEGO1/mxsoundmanager.h index 3421a5d6..4d74fa95 100644 --- a/LEGO1/mxsoundmanager.h +++ b/LEGO1/mxsoundmanager.h @@ -1,17 +1,21 @@ #ifndef MXSOUNDMANAGER_H #define MXSOUNDMANAGER_H -#include "mxcore.h" +#include "mxunknown100dc6e0.h" // VTABLE 0x100dc128 // SIZE 0x3c // Base vtables are: MxCore -> 0x100dc6b0 -> 0x100dc6e0 -> MxSoundManager -class MxSoundManager +class MxSoundManager : public MxUnknown100dc6e0 { public: MxSoundManager(); virtual ~MxSoundManager() override; // vtable+0x0 +private: + void Init(); + int m_unk30; + int m_unk34; }; #endif // MXSOUNDMANAGER_H diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index f8eeb43b..de84ed01 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -15,7 +15,7 @@ class MxStreamer : public MxCore __declspec(dllexport) long Close(const char *p); virtual long Notify(MxParam &p) override; // vtable+0x4 - virtual MxResult VTable0x14() override; // vtable+0x14 + virtual MxResult VTable0x14(); // vtable+0x14 }; #endif // MXSTREAMER_H diff --git a/LEGO1/mxstringvariable.cpp b/LEGO1/mxstringvariable.cpp index a9432679..e63329c1 100644 --- a/LEGO1/mxstringvariable.cpp +++ b/LEGO1/mxstringvariable.cpp @@ -1,14 +1,6 @@ -#include "MxStringVariable.h" +#include "mxstringvariable.h" #include "mxstring.h" -//FIXME: Figure out what exactly this class is used for. It is used in LegoGameState::LegoGameState when loading the background color, and for loading the "fsmovie" variable -// OFFSET: LEGO1 0x1003bec0 -MxStringVariable::~MxStringVariable() -{ - - delete &m_string; - delete &m_name; -} // OFFSET: LEGO1 0x1003bea0 MxString *MxStringVariable::GetString() @@ -21,3 +13,10 @@ void MxStringVariable::SetString(const char *colorString) { m_string = colorString; } + +//FIXME: Figure out what exactly this class is used for. It is used in LegoGameState::LegoGameState when loading the background color, and for loading the "fsmovie" variable +// OFFSET: LEGO1 0x1003bec0 +void MxStringVariable::Destroy() +{ + delete this; +} diff --git a/LEGO1/mxstringvariable.h b/LEGO1/mxstringvariable.h index 5284fc5d..dd623dfb 100644 --- a/LEGO1/mxstringvariable.h +++ b/LEGO1/mxstringvariable.h @@ -10,7 +10,7 @@ class MxStringVariable MxStringVariable() {} virtual MxString *GetString(); virtual void SetString(const char *colorString); - virtual ~MxStringVariable(); + virtual void Destroy(); protected: MxString m_name; diff --git a/LEGO1/mxtimer.h b/LEGO1/mxtimer.h index d79023d8..564eedfa 100644 --- a/LEGO1/mxtimer.h +++ b/LEGO1/mxtimer.h @@ -15,7 +15,7 @@ class MxTimer : public MxCore __declspec(dllexport) long GetRealTime(); - long GetTime() inline + inline long GetTime() { if (this->m_isRunning) return s_LastTimeCalculated; diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index 3fdb1ebf..9dcb7f7c 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -9,7 +9,8 @@ class MxVideoPresenter; class MxTransitionManager : public MxCore { public: - virtual ~MxTransitionManager(); // vtable+0x0 + MxTransitionManager(); + virtual ~MxTransitionManager() override; // vtable+0x0 __declspec(dllexport) void SetWaitIndicator(MxVideoPresenter *videoPresenter); diff --git a/LEGO1/mxunknown100dc6b0.cpp b/LEGO1/mxunknown100dc6b0.cpp index 029be1f7..b896fa10 100644 --- a/LEGO1/mxunknown100dc6b0.cpp +++ b/LEGO1/mxunknown100dc6b0.cpp @@ -6,6 +6,12 @@ MxUnknown100dc6b0::MxUnknown100dc6b0() Init(); } +// OFFSET: LEGO1 0x100b8560 STUB +MxUnknown100dc6b0::~MxUnknown100dc6b0() +{ + // TODO +} + // OFFSET: LEGO1 0x100b85d0 MxResult MxUnknown100dc6b0::Init() { diff --git a/LEGO1/mxunknown100dc6b0.h b/LEGO1/mxunknown100dc6b0.h index ca2ee600..29d42209 100644 --- a/LEGO1/mxunknown100dc6b0.h +++ b/LEGO1/mxunknown100dc6b0.h @@ -10,6 +10,7 @@ class MxUnknown100dc6b0 : public MxCore { public: MxUnknown100dc6b0(); + virtual ~MxUnknown100dc6b0() override; MxResult Init(); diff --git a/LEGO1/mxunknown100dc6e0.cpp b/LEGO1/mxunknown100dc6e0.cpp new file mode 100644 index 00000000..b896e89b --- /dev/null +++ b/LEGO1/mxunknown100dc6e0.cpp @@ -0,0 +1,19 @@ +#include "mxunknown100dc6e0.h" + +// OFFSET: LEGO1 0x100b8d00 +MxUnknown100dc6e0::MxUnknown100dc6e0() +{ + Init(); +} + +// OFFSET: LEGO1 0x100b8d90 STUB +MxUnknown100dc6e0::~MxUnknown100dc6e0() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b8df0 +void MxUnknown100dc6e0::Init() +{ + this->m_unk2c = 100; +} diff --git a/LEGO1/mxunknown100dc6e0.h b/LEGO1/mxunknown100dc6e0.h new file mode 100644 index 00000000..79c63bab --- /dev/null +++ b/LEGO1/mxunknown100dc6e0.h @@ -0,0 +1,19 @@ +#ifndef MXUNKNOWN100DC6E0_H +#define MXUNKNOWN100DC6E0_H + +#include "mxunknown100dc6b0.h" + +// VTABLE 0x100dc6e0 +class MxUnknown100dc6e0 : public MxUnknown100dc6b0 +{ +public: + MxUnknown100dc6e0(); + virtual ~MxUnknown100dc6e0() override; + +protected: + void Init(); + + int m_unk2c; +}; + +#endif // MXUNKNOWN100DC6E0_H diff --git a/LEGO1/mxvideoparam.cpp b/LEGO1/mxvideoparam.cpp index b72107c7..81f5d2d7 100644 --- a/LEGO1/mxvideoparam.cpp +++ b/LEGO1/mxvideoparam.cpp @@ -17,7 +17,7 @@ MxVideoParam::MxVideoParam() } // OFFSET: LEGO1 0x100beca0 -MxVideoParam::MxVideoParam(MxRect32 &p_rect, MxPalette *p_pal, unsigned long p_backBuffers, MxVideoParamFlags &p_flags) +MxVideoParam::MxVideoParam(COMPAT_CONST MxRect32 &p_rect, MxPalette *p_pal, unsigned long p_backBuffers, COMPAT_CONST MxVideoParamFlags &p_flags) { this->m_rect.m_left = p_rect.m_left; this->m_rect.m_top = p_rect.m_top; diff --git a/LEGO1/mxvideoparam.h b/LEGO1/mxvideoparam.h index 3e00a920..0b6b2a38 100644 --- a/LEGO1/mxvideoparam.h +++ b/LEGO1/mxvideoparam.h @@ -3,6 +3,7 @@ #include +#include "compat.h" #include "mxpalette.h" #include "mxrect32.h" #include "mxtypes.h" @@ -14,7 +15,7 @@ class MxVideoParam public: __declspec(dllexport) MxVideoParam(); __declspec(dllexport) MxVideoParam(MxVideoParam &); - __declspec(dllexport) MxVideoParam(MxRect32 &rect, MxPalette *pal, unsigned long p3, MxVideoParamFlags &flags); + __declspec(dllexport) MxVideoParam(COMPAT_CONST MxRect32 &rect, MxPalette *pal, unsigned long p3, COMPAT_CONST MxVideoParamFlags &flags); __declspec(dllexport) MxVideoParam &operator=(const MxVideoParam &); __declspec(dllexport) ~MxVideoParam(); From 646b39e8765d0c93897c210f0308be7d47e053bf Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Sun, 2 Jul 2023 09:00:28 +0200 Subject: [PATCH 27/34] Implement MxObjectFactory::{MxObjectFactory,Create} + match sizes of Mx.*Presenter objects created by it (#59) * Get Isle building on MinGW32 (#63) * Add MxUnknown100dc6b0::~MxUnknown100dc6b0 stub * Declare destructor of MxOmni and MxTransitionManager in class * inline attribute must go first * Stub LegoState::Vtable0x14 for Act3State * MxStreamer::VTable0x14 is not an override * Stub MxEntity::Destroy for LegoState::Destroy * Stub MxUnknown100dc6e0 for MxSoundManager * ::ClassName and ::IsA are const methods * methods in the class body don't need a namespace * MxSoundManager subclasses MxUnknown100dc6e0 * LegoInputManager subclasses MxPresenter * NotificationId is an enum, and does not need __declspec(dllexport) * Fix final #endif of legoomni.h and mxobjectfactory.h * Add const alternative for LegoOmni::Create and MxVideoParam, only available for MinGW * Alternative approach to MinGW compatibility * MinGW on Linux is case sensitve * Don't delete a member variable. C++ automatically destructs member variables --------- Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com> * MxatomId: implement inline operator== * Add decomp.h header, containing macro's only used when matching the original binaries * Add in-line constructor of MxPresenter * MxMediaPresenter: add members to match size * MxVideoPresenter: add members to match size * MxCompositePresenter: add members to match size * MxFlcPresenter: add members to match size * MxSmkPresenter: add members to match size * MxStillPresenter: add members to match size * MxAudioPresenter: add members to match size * MxWavePresenter: add members to match size * MxMIDIPresenter: add members to match size * MxEventPresenter: add members to match size * MxLoopingFlcPresenter: add members to match size * MxLoopingSmkPresenter: add members to match size * MxLoopingMIDIPresenter: add check for size * Implement MxObjectFactory::{MxObjectFactory,Create} Matching of MxObjectFactory::Create is not good, because none of the other objects have been implemented. * Implement a few MxPresenter methods * Fix size of LegoInputManager * Fix name of first padding member of legoinputmanager.h * add DECOMP_SIZE_ASSERT macro * Use DECOMP_SIZE_ASSERT macro + convert to hexadecimal * fixed minor typos --------- Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com> Co-authored-by: itsmattkc --- CMakeLists.txt | 3 ++ LEGO1/decomp.h | 11 ++++++ LEGO1/legoinputmanager.cpp | 4 +++ LEGO1/legoinputmanager.h | 5 +-- LEGO1/mxatomid.h | 11 ++++++ LEGO1/mxaudiopresenter.cpp | 4 +++ LEGO1/mxaudiopresenter.h | 8 ++++- LEGO1/mxcompositepresenter.cpp | 4 +++ LEGO1/mxcompositepresenter.h | 5 ++- LEGO1/mxeventpresenter.cpp | 8 +++-- LEGO1/mxeventpresenter.h | 5 ++- LEGO1/mxflcpresenter.cpp | 4 +++ LEGO1/mxflcpresenter.h | 4 +++ LEGO1/mxloopingflcpresenter.cpp | 4 +++ LEGO1/mxloopingflcpresenter.h | 5 ++- LEGO1/mxloopingmidipresenter.cpp | 5 +++ LEGO1/mxloopingsmkpresenter.cpp | 4 +++ LEGO1/mxloopingsmkpresenter.h | 5 ++- LEGO1/mxmediapresenter.cpp | 2 ++ LEGO1/mxmediapresenter.h | 6 ++++ LEGO1/mxmidipresenter.cpp | 16 +++++++++ LEGO1/mxmidipresenter.h | 5 +++ LEGO1/mxobjectfactory.cpp | 45 ++++++++++++++++++++++++ LEGO1/mxobjectfactory.h | 24 ++++++++++++- LEGO1/mxpresenter.cpp | 59 +++++++++++++++++--------------- LEGO1/mxpresenter.h | 47 +++++++++++++------------ LEGO1/mxsmkpresenter.cpp | 4 +++ LEGO1/mxsmkpresenter.h | 7 ++-- LEGO1/mxstillpresenter.cpp | 4 +++ LEGO1/mxstillpresenter.h | 7 ++++ LEGO1/mxvideopresenter.cpp | 7 ++++ LEGO1/mxvideopresenter.h | 16 ++++++++- LEGO1/mxwavepresenter.cpp | 15 ++++++-- LEGO1/mxwavepresenter.h | 16 ++++++++- 34 files changed, 312 insertions(+), 67 deletions(-) create mode 100644 LEGO1/decomp.h create mode 100644 LEGO1/mxloopingmidipresenter.cpp create mode 100644 LEGO1/mxmidipresenter.cpp create mode 100644 LEGO1/mxobjectfactory.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d4976fa..cdfebd05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,10 +121,13 @@ add_library(lego1 SHARED LEGO1/mxflcpresenter.cpp LEGO1/mxioinfo.cpp LEGO1/mxloopingflcpresenter.cpp + LEGO1/mxloopingmidipresenter.cpp LEGO1/mxloopingsmkpresenter.cpp LEGO1/mxmediapresenter.cpp + LEGO1/mxmidipresenter.cpp LEGO1/mxmusicpresenter.cpp LEGO1/mxnotificationmanager.cpp + LEGO1/mxobjectfactory.cpp LEGO1/mxomni.cpp LEGO1/mxomnicreateflags.cpp LEGO1/mxomnicreateparam.cpp diff --git a/LEGO1/decomp.h b/LEGO1/decomp.h new file mode 100644 index 00000000..5466e6d8 --- /dev/null +++ b/LEGO1/decomp.h @@ -0,0 +1,11 @@ +#ifndef DECOMP_H +#define DECOMP_H + +#define DECOMP_STATIC_ASSERT(V) namespace { typedef int foo[(V)?1:-1]; } +#define DECOMP_SIZE_ASSERT(T, S) DECOMP_STATIC_ASSERT(sizeof(T) == S) + +typedef unsigned char undefined; +typedef unsigned short undefined2; +typedef unsigned int undefined4; + +#endif // DECOMP_H diff --git a/LEGO1/legoinputmanager.cpp b/LEGO1/legoinputmanager.cpp index 792da404..6c0bd709 100644 --- a/LEGO1/legoinputmanager.cpp +++ b/LEGO1/legoinputmanager.cpp @@ -1,5 +1,9 @@ #include "legoinputmanager.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(LegoInputManager, 0x338); // 0x10059085 + // OFFSET: LEGO1 0x1005b790 STUB LegoInputManager::LegoInputManager() { diff --git a/LEGO1/legoinputmanager.h b/LEGO1/legoinputmanager.h index c629134e..74a2a8fa 100644 --- a/LEGO1/legoinputmanager.h +++ b/LEGO1/legoinputmanager.h @@ -1,6 +1,7 @@ #ifndef LEGOINPUTMANAGER_H #define LEGOINPUTMANAGER_H +#include "decomp.h" #include "mxpresenter.h" enum NotificationId @@ -27,9 +28,9 @@ class LegoInputManager : public MxPresenter virtual long Tickle() override; // vtable+0x8 - char m_pad00[0x15c]; + undefined m_pad40[0x15c]; int m_joystickIndex; - char m_pad200[0x194]; + undefined m_pad200[0x194]; MxBool m_useJoystick; }; diff --git a/LEGO1/mxatomid.h b/LEGO1/mxatomid.h index 9a218a1b..6b7dddbb 100644 --- a/LEGO1/mxatomid.h +++ b/LEGO1/mxatomid.h @@ -1,8 +1,14 @@ #ifndef MXATOMID_H #define MXATOMID_H +#include "mxtypes.h" + enum LookupMode { + LookupMode_Exact = 0, + LookupMode_LowerCase = 1, + LookupMode_UpperCase = 2, + LookupMode_LowerCase2 = 3 }; class MxAtomId @@ -17,6 +23,11 @@ class MxAtomId this->m_internal = 0; } + inline MxBool operator ==(const MxAtomId &other) const + { + return this->m_internal == other.m_internal; + } + private: char *m_internal; }; diff --git a/LEGO1/mxaudiopresenter.cpp b/LEGO1/mxaudiopresenter.cpp index b15c2556..ac634362 100644 --- a/LEGO1/mxaudiopresenter.cpp +++ b/LEGO1/mxaudiopresenter.cpp @@ -1 +1,5 @@ #include "mxaudiopresenter.h" + +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxAudioPresenter, 0x54); diff --git a/LEGO1/mxaudiopresenter.h b/LEGO1/mxaudiopresenter.h index b23eefe9..c1001a13 100644 --- a/LEGO1/mxaudiopresenter.h +++ b/LEGO1/mxaudiopresenter.h @@ -7,9 +7,13 @@ class MxAudioPresenter : public MxMediaPresenter { public: + MxAudioPresenter() { + m_unk50 = 100; + } + // OFFSET: LEGO1 0x1000d280 inline virtual const char *ClassName() const override // vtable+0x0c - { + { // 0x100f078c return "MxAudioPresenter"; } @@ -19,6 +23,8 @@ class MxAudioPresenter : public MxMediaPresenter { return !strcmp(name, MxAudioPresenter::ClassName()) || MxMediaPresenter::IsA(name); } + + int m_unk50; }; #endif // MXAUDIOPRESENTER_H diff --git a/LEGO1/mxcompositepresenter.cpp b/LEGO1/mxcompositepresenter.cpp index e42dbadb..342f3d96 100644 --- a/LEGO1/mxcompositepresenter.cpp +++ b/LEGO1/mxcompositepresenter.cpp @@ -1,5 +1,9 @@ #include "mxcompositepresenter.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxCompositePresenter, 0x4c); + // OFFSET: LEGO1 0x100b60b0 STUB MxCompositePresenter::MxCompositePresenter() { diff --git a/LEGO1/mxcompositepresenter.h b/LEGO1/mxcompositepresenter.h index 471f3087..9f517652 100644 --- a/LEGO1/mxcompositepresenter.h +++ b/LEGO1/mxcompositepresenter.h @@ -13,7 +13,7 @@ class MxCompositePresenter : public MxPresenter // OFFSET: LEGO1 0x100b6210 inline virtual const char *ClassName() const override // vtable+0x0c - { + { // 0x100f0774 return "MxCompositePresenter"; } @@ -24,6 +24,9 @@ class MxCompositePresenter : public MxPresenter return !strcmp(name, MxCompositePresenter::ClassName()) || MxPresenter::IsA(name); } + undefined m_unk40; + undefined4 *m_unk44; + undefined4 m_unk48; }; #endif // MXCOMPOSITEPRESENTER_H diff --git a/LEGO1/mxeventpresenter.cpp b/LEGO1/mxeventpresenter.cpp index ba78203f..88c20ce3 100644 --- a/LEGO1/mxeventpresenter.cpp +++ b/LEGO1/mxeventpresenter.cpp @@ -1,5 +1,9 @@ #include "mxeventpresenter.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxEventPresenter, 0x54); + // OFFSET: LEGO1 0x100c2b70 MxEventPresenter::MxEventPresenter() { @@ -12,8 +16,8 @@ MxEventPresenter::~MxEventPresenter() // TODO } -// OFFSET: LEGO1 0x100c2da0 STUB +// OFFSET: LEGO1 0x100c2da0 void MxEventPresenter::Init() { - // TODO + m_unk50 = 0; } diff --git a/LEGO1/mxeventpresenter.h b/LEGO1/mxeventpresenter.h index 2adb8cfa..256d0c7f 100644 --- a/LEGO1/mxeventpresenter.h +++ b/LEGO1/mxeventpresenter.h @@ -3,6 +3,8 @@ #include "mxmediapresenter.h" +#include "decomp.h" + // VTABLE 0x100dca88 // SIZE 0x54 class MxEventPresenter : public MxMediaPresenter @@ -23,9 +25,10 @@ class MxEventPresenter : public MxMediaPresenter { return !strcmp(name, MxEventPresenter::ClassName()) || MxMediaPresenter::IsA(name); } - + private: void Init(); + undefined4 m_unk50; }; diff --git a/LEGO1/mxflcpresenter.cpp b/LEGO1/mxflcpresenter.cpp index 1e6ee289..8bd23d22 100644 --- a/LEGO1/mxflcpresenter.cpp +++ b/LEGO1/mxflcpresenter.cpp @@ -1,5 +1,9 @@ #include "mxflcpresenter.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxFlcPresenter, 0x68); + // OFFSET: LEGO1 0x100b3310 STUB MxFlcPresenter::MxFlcPresenter() { diff --git a/LEGO1/mxflcpresenter.h b/LEGO1/mxflcpresenter.h index 5d63c41c..bc34ff12 100644 --- a/LEGO1/mxflcpresenter.h +++ b/LEGO1/mxflcpresenter.h @@ -3,6 +3,8 @@ #include "mxvideopresenter.h" +#include "decomp.h" + // VTABLE 0x100dc2c0 // SIZE 0x68 class MxFlcPresenter : public MxVideoPresenter @@ -23,6 +25,8 @@ class MxFlcPresenter : public MxVideoPresenter { return !strcmp(name, MxFlcPresenter::ClassName()) || MxVideoPresenter::IsA(name); } + + undefined4 m_unk64; }; #endif // MXFLCPRESENTER_H diff --git a/LEGO1/mxloopingflcpresenter.cpp b/LEGO1/mxloopingflcpresenter.cpp index f4602f3c..041ae6a5 100644 --- a/LEGO1/mxloopingflcpresenter.cpp +++ b/LEGO1/mxloopingflcpresenter.cpp @@ -1,5 +1,9 @@ #include "mxloopingflcpresenter.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxLoopingFlcPresenter, 0x6c); + // OFFSET: LEGO1 0x100b4310 STUB MxLoopingFlcPresenter::MxLoopingFlcPresenter() { diff --git a/LEGO1/mxloopingflcpresenter.h b/LEGO1/mxloopingflcpresenter.h index 5152e4d9..1973c28e 100644 --- a/LEGO1/mxloopingflcpresenter.h +++ b/LEGO1/mxloopingflcpresenter.h @@ -3,6 +3,8 @@ #include "mxflcpresenter.h" +#include "decomp.h" + // VTABLE 0x100dc480 // SIZE 0x6c class MxLoopingFlcPresenter : public MxFlcPresenter @@ -17,9 +19,10 @@ class MxLoopingFlcPresenter : public MxFlcPresenter // 0x10101e20 return "MxLoopingFlcPresenter"; } - + private: void Init(); + undefined4 m_unk68; }; #endif // MXLOOPINGFLCPRESENTER_H diff --git a/LEGO1/mxloopingmidipresenter.cpp b/LEGO1/mxloopingmidipresenter.cpp new file mode 100644 index 00000000..ebeed4b4 --- /dev/null +++ b/LEGO1/mxloopingmidipresenter.cpp @@ -0,0 +1,5 @@ +#include "mxloopingmidipresenter.h" + +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxLoopingMIDIPresenter, 0x58); diff --git a/LEGO1/mxloopingsmkpresenter.cpp b/LEGO1/mxloopingsmkpresenter.cpp index cb038462..da9223df 100644 --- a/LEGO1/mxloopingsmkpresenter.cpp +++ b/LEGO1/mxloopingsmkpresenter.cpp @@ -1,5 +1,9 @@ #include "mxloopingsmkpresenter.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxLoopingSmkPresenter, 0x724); + // OFFSET: LEGO1 0x100b48b0 MxLoopingSmkPresenter::MxLoopingSmkPresenter() { diff --git a/LEGO1/mxloopingsmkpresenter.h b/LEGO1/mxloopingsmkpresenter.h index 129d98b9..8ca18d20 100644 --- a/LEGO1/mxloopingsmkpresenter.h +++ b/LEGO1/mxloopingsmkpresenter.h @@ -3,6 +3,8 @@ #include "mxsmkpresenter.h" +#include "decomp.h" + // VTABLE 0x100dc540 // SIZE 0x724 class MxLoopingSmkPresenter : public MxSmkPresenter @@ -17,9 +19,10 @@ class MxLoopingSmkPresenter : public MxSmkPresenter // 0x10101e08 return "MxLoopingSmkPresenter"; } - + private: void Init(); + undefined4 m_unk720; }; #endif // MXLOOPINGSMKPRESENTER_H diff --git a/LEGO1/mxmediapresenter.cpp b/LEGO1/mxmediapresenter.cpp index 793b3ea8..9df33285 100644 --- a/LEGO1/mxmediapresenter.cpp +++ b/LEGO1/mxmediapresenter.cpp @@ -1,5 +1,7 @@ #include "mxmediapresenter.h" +DECOMP_SIZE_ASSERT(MxMediaPresenter, 0x50); + // OFFSET: LEGO1 0x100b5d10 STUB long MxMediaPresenter::Tickle() { diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h index 647150c4..b3a1b38a 100644 --- a/LEGO1/mxmediapresenter.h +++ b/LEGO1/mxmediapresenter.h @@ -3,6 +3,8 @@ #include "mxpresenter.h" +#include "decomp.h" + // VTABLE 0x100d4cd8 class MxMediaPresenter : public MxPresenter { @@ -27,6 +29,10 @@ class MxMediaPresenter : public MxPresenter return !strcmp(name, MxMediaPresenter::ClassName()) || MxPresenter::IsA(name); } + undefined4 m_unk40; + undefined4 m_unk44; + undefined4 m_unk48; + undefined4 m_unk4c; private: void Init(); diff --git a/LEGO1/mxmidipresenter.cpp b/LEGO1/mxmidipresenter.cpp new file mode 100644 index 00000000..98868f8a --- /dev/null +++ b/LEGO1/mxmidipresenter.cpp @@ -0,0 +1,16 @@ +#include "mxmidipresenter.h" + +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxMIDIPresenter, 0x58); + +// OFFSET: LEGO1 0x100c25e0 +MxMIDIPresenter::MxMIDIPresenter() { + Init(); +} + +// OFFSET: LEGO1 0x100c2820 +void MxMIDIPresenter::Init() +{ + m_unk54 = 0; +} diff --git a/LEGO1/mxmidipresenter.h b/LEGO1/mxmidipresenter.h index 8a46d12a..1cd65c4a 100644 --- a/LEGO1/mxmidipresenter.h +++ b/LEGO1/mxmidipresenter.h @@ -6,6 +6,11 @@ // VTABLE 0x100dca20 class MxMIDIPresenter : public MxMusicPresenter { +public: + MxMIDIPresenter(); +private: + void Init(); + undefined4 m_unk54; }; #endif // MXMIDIPRESENTER_H diff --git a/LEGO1/mxobjectfactory.cpp b/LEGO1/mxobjectfactory.cpp new file mode 100644 index 00000000..d52e4dac --- /dev/null +++ b/LEGO1/mxobjectfactory.cpp @@ -0,0 +1,45 @@ +#include "mxobjectfactory.h" + +#include "mxpresenter.h" +#include "mxcompositepresenter.h" +#include "mxvideopresenter.h" +#include "mxflcpresenter.h" +#include "mxsmkpresenter.h" +#include "mxstillpresenter.h" +#include "mxwavepresenter.h" +#include "mxmidipresenter.h" +#include "mxeventpresenter.h" +#include "mxloopingflcpresenter.h" +#include "mxloopingsmkpresenter.h" +#include "mxloopingmidipresenter.h" + +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxObjectFactory, 0x38); // 100af1db + +// OFFSET: LEGO1 0x100b0d80 +MxObjectFactory::MxObjectFactory() +{ +#define X(V) this->m_id##V = MxAtomId(#V, LookupMode_Exact); + FOR_MXOBJECTFACTORY_OBJECTS(X) +#undef X +} + +// OFFSET: LEGO1 0x100b12c0 +MxCore *MxObjectFactory::Create(const char *name) +{ + MxAtomId atom(name, LookupMode_Exact); + + if (0) { +#define X(V) } else if (this->m_id##V == atom) { return new V; + FOR_MXOBJECTFACTORY_OBJECTS(X) +#undef X + } else { + return NULL; + } +} + +// OFFSET: LEGO1 0x100b1a30 STUB +void MxObjectFactory::vtable18(void *) { + // FIXME +} diff --git a/LEGO1/mxobjectfactory.h b/LEGO1/mxobjectfactory.h index bdd172a8..53aee2cb 100644 --- a/LEGO1/mxobjectfactory.h +++ b/LEGO1/mxobjectfactory.h @@ -2,11 +2,33 @@ #define MXOBJECTFACTORY_H #include "mxcore.h" +#include "mxatomid.h" + +#define FOR_MXOBJECTFACTORY_OBJECTS(X) \ + X(MxPresenter) \ + X(MxCompositePresenter) \ + X(MxVideoPresenter) \ + X(MxFlcPresenter) \ + X(MxSmkPresenter) \ + X(MxStillPresenter) \ + X(MxWavePresenter) \ + X(MxMIDIPresenter) \ + X(MxEventPresenter) \ + X(MxLoopingFlcPresenter) \ + X(MxLoopingSmkPresenter) \ + X(MxLoopingMIDIPresenter) // VTABLE 0x100dc220 class MxObjectFactory : public MxCore { - +public: + MxObjectFactory(); + virtual MxCore *Create(const char *name); // vtable 0x14 + virtual void vtable18(void *); // vtable 0x18 +private: +#define X(V) MxAtomId m_id##V; + FOR_MXOBJECTFACTORY_OBJECTS(X) +#undef X }; #endif // MXOBJECTFACTORY_H diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp index 893de60d..5ef01c64 100644 --- a/LEGO1/mxpresenter.cpp +++ b/LEGO1/mxpresenter.cpp @@ -1,5 +1,9 @@ #include "mxpresenter.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxPresenter, 0x40); + // OFFSET: LEGO1 0x1000bee0 STUB void MxPresenter::DoneTickle() { @@ -24,10 +28,9 @@ void MxPresenter::ParseExtra() // TODO } -// OFFSET: LEGO1 0x1000c070 STUB +// OFFSET: LEGO1 0x1000bf00 MxPresenter::~MxPresenter() { - // TODO } // OFFSET: LEGO1 0x100b5200 STUB @@ -46,52 +49,57 @@ long MxPresenter::StartAction(MxStreamController *, MxDSAction *) return 0; } -// OFFSET: LEGO1 0x100d4d74 STUB +// OFFSET: LEGO1 0x100b4e40 STUB void MxPresenter::EndAction() { // TODO } -// OFFSET: LEGO1 0x100d4d8c STUB +// OFFSET: LEGO1 0x100b52d0 STUB void MxPresenter::Enable(unsigned char) { // TODO } -// OFFSET: LEGO1 0x1000be30 STUB +// OFFSET: LEGO1 0x1000be30 void MxPresenter::VTable0x14() { - // TODO } -// OFFSET: LEGO1 0x1000be40 STUB +// OFFSET: LEGO1 0x1000be40 void MxPresenter::VTable0x18() { - // TODO + ParseExtra(); + m_unk0xc |= 1 << (unsigned char)m_unk0x8; + m_unk0x8 = 2; } -// OFFSET: LEGO1 0x1000be60 STUB +// OFFSET: LEGO1 0x1000be60 void MxPresenter::VTable0x1c() { - // TODO + m_unk0xc |= 1 << (unsigned char)m_unk0x8; + m_unk0x8 = 3; } -// OFFSET: LEGO1 0x1000be80 STUB +// OFFSET: LEGO1 0x1000be80 void MxPresenter::VTable0x20() { - // TODO + m_unk0xc |= 1 << (unsigned char)m_unk0x8; + m_unk0x8 = 4; } -// OFFSET: LEGO1 0x1000bea0 STUB +// OFFSET: LEGO1 0x1000bea0 void MxPresenter::VTable0x24() { - // TODO + m_unk0xc |= 1 << (unsigned char)m_unk0x8; + m_unk0x8 = 5; } -// OFFSET: LEGO1 0x1000bec0 STUB +// OFFSET: LEGO1 0x1000bec0 void MxPresenter::VTable0x28() { - // TODO + m_unk0xc |= 1 << (unsigned char)m_unk0x8; + m_unk0x8 = 6; } // OFFSET: LEGO1 0x1000bf70 @@ -105,18 +113,17 @@ void MxPresenter::InitVirtual() { Init(); } -// OFFSET: LEGO1 0x1000bf90 STUB +// OFFSET: LEGO1 0x1000bf90 void MxPresenter::VTable0x44(undefined4 param) { - // TODO + m_unk0xc |= 1 << (unsigned char)m_unk0x8; + m_unk0x8 = param; } -// OFFSET: LEGO1 0x1000bfb0 STUB -undefined4 MxPresenter::VTable0x48(undefined4 param) +// OFFSET: LEGO1 0x1000bfb0 +unsigned char MxPresenter::VTable0x48(unsigned char param) { - // TODO - - return undefined4(); + return m_unk0xc & (1 << param); } // OFFSET: LEGO1 0x1000bfc0 @@ -125,10 +132,8 @@ undefined4 MxPresenter::VTable0x4c() return 0; } -// OFFSET: LEGO1 0x1000bfd0 STUB -undefined MxPresenter::VTable0x50() +// OFFSET: LEGO1 0x1000bfd0 +undefined MxPresenter::VTable0x50(undefined4, undefined4) { - // TODO - return 0; } diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index 6ea022da..a6616bd8 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -5,65 +5,64 @@ #include "mxcriticalsection.h" +#include "decomp.h" + class MxStreamController; class MxDSAction; -#ifndef undefined4 -#define undefined4 int -#endif - -#ifndef undefined -#define undefined int -#endif - class MxPresenter : public MxCore { public: + MxPresenter() { + Init(); + } __declspec(dllexport) virtual ~MxPresenter(); // vtable+0x0 // OFFSET: LEGO1 0x1000bfe0 - inline virtual const char *ClassName() const // vtable+0xc + inline virtual const char *ClassName() const override// vtable+0xc { // 0x100f0740 return "MxPresenter"; } // OFFSET: LEGO1 0x1000bff0 - inline virtual MxBool IsA(const char *name) const // vtable+0x10 + inline virtual MxBool IsA(const char *name) const override// vtable+0x10 { return !strcmp(name, MxPresenter::ClassName()) || MxCore::IsA(name); } - __declspec(dllexport) virtual long Tickle(); // vtable+0x8 + __declspec(dllexport) virtual long Tickle() override; // vtable+0x8 virtual void VTable0x14(); // vtable+0x14 virtual void VTable0x18(); // vtable+0x18 virtual void VTable0x1c(); // vtable+0x1c virtual void VTable0x20(); // vtable+0x20 virtual void VTable0x24(); // vtable+0x24 virtual void VTable0x28(); // vtable+0x28 - virtual undefined4 VTable0x34(); // vtable+0x34 - virtual void InitVirtual(); // vtable+0x38 - virtual void VTable0x44(undefined4 param); // vtable+0x44 - virtual undefined4 VTable0x48(undefined4 param); // vtable+0x48 - virtual undefined4 VTable0x4c(); // vtable+0x4c - virtual undefined VTable0x50(); // vtable+0x50 protected: __declspec(dllexport) virtual void DoneTickle(); // vtable+0x2c - __declspec(dllexport) void Init(); __declspec(dllexport) virtual void ParseExtra(); // vtable+0x30 public: + virtual undefined4 VTable0x34(); // vtable+0x34 + virtual void InitVirtual(); // vtable+0x38 __declspec(dllexport) virtual long StartAction(MxStreamController *, MxDSAction *); // vtable+0x3c __declspec(dllexport) virtual void EndAction(); // vtable+0x40 + virtual void VTable0x44(undefined4 param); // vtable+0x44 + virtual unsigned char VTable0x48(unsigned char param); // vtable+0x48 + virtual undefined4 VTable0x4c(); // vtable+0x4c + virtual undefined VTable0x50(undefined4, undefined4); // vtable+0x50 __declspec(dllexport) virtual void Enable(unsigned char); // vtable+0x54 +protected: + __declspec(dllexport) void Init(); +public: - int m_unk0x8; - int m_unk0xc; - int m_unk0x10; - int m_unk0x14; - int m_unk0x18; + undefined4 m_unk0x8; + undefined4 m_unk0xc; + undefined4 m_unk0x10; + undefined4 m_unk0x14; + undefined4 m_unk0x18; MxDSAction* m_action; // 0 MxCriticalSection m_criticalSection; - int m_unk0x3c; + undefined4 m_unk0x3c; // VTABLE 0x100d4d38 }; diff --git a/LEGO1/mxsmkpresenter.cpp b/LEGO1/mxsmkpresenter.cpp index 9f160a99..cc7efec1 100644 --- a/LEGO1/mxsmkpresenter.cpp +++ b/LEGO1/mxsmkpresenter.cpp @@ -1,5 +1,9 @@ #include "mxsmkpresenter.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxSmkPresenter, 0x720); + // OFFSET: LEGO1 0x100b3650 STUB MxSmkPresenter::MxSmkPresenter() { diff --git a/LEGO1/mxsmkpresenter.h b/LEGO1/mxsmkpresenter.h index b439bc2a..325091bb 100644 --- a/LEGO1/mxsmkpresenter.h +++ b/LEGO1/mxsmkpresenter.h @@ -3,16 +3,19 @@ #include "mxvideopresenter.h" +#include "decomp.h" + // VTABLE 0x100dc348 // SIZE 0x720 class MxSmkPresenter : public MxVideoPresenter { public: MxSmkPresenter(); - + + undefined4 m_unk64[430]; + undefined4 m_unk71c; private: void Init(); - }; #endif // MXSMKPRESENTER_H diff --git a/LEGO1/mxstillpresenter.cpp b/LEGO1/mxstillpresenter.cpp index bc2b03b5..351971f0 100644 --- a/LEGO1/mxstillpresenter.cpp +++ b/LEGO1/mxstillpresenter.cpp @@ -1 +1,5 @@ #include "mxstillpresenter.h" + +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxStillPresenter, 0x6c); diff --git a/LEGO1/mxstillpresenter.h b/LEGO1/mxstillpresenter.h index d9376b8e..9b7c5810 100644 --- a/LEGO1/mxstillpresenter.h +++ b/LEGO1/mxstillpresenter.h @@ -3,11 +3,18 @@ #include "mxvideopresenter.h" +#include "decomp.h" + // VTABLE 0x100d7a38 // SIZE 0x6c class MxStillPresenter : public MxVideoPresenter { public: + MxStillPresenter() { + m_unk68 = 0; + } + undefined4 m_unk64; + undefined4 m_unk68; }; #endif // MXSTILLPRESENTER_H diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp index 894b1e9c..ee12968a 100644 --- a/LEGO1/mxvideopresenter.cpp +++ b/LEGO1/mxvideopresenter.cpp @@ -1 +1,8 @@ #include "mxvideopresenter.h" + +DECOMP_SIZE_ASSERT(MxVideoPresenter, 0x64); + +// OFFSET: LEGO1 0x100b2760 STUB +void MxVideoPresenter::Init() { + // TODO +} diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h index eba5040c..e9634427 100644 --- a/LEGO1/mxvideopresenter.h +++ b/LEGO1/mxvideopresenter.h @@ -3,12 +3,17 @@ #include "mxmediapresenter.h" +#include "decomp.h" + class MxVideoPresenter : public MxMediaPresenter { public: + MxVideoPresenter() { + Init(); + } // OFFSET: LEGO1 0x1000c820 inline virtual const char *ClassName() const override // vtable+0x0c - { + { // 0x100f0760 return "MxVideoPresenter"; } @@ -18,6 +23,15 @@ class MxVideoPresenter : public MxMediaPresenter { return !strcmp(name, MxVideoPresenter::ClassName()) || MxMediaPresenter::IsA(name); } + + void Init(); + + undefined4 m_unk50; + undefined4 m_unk54; + undefined4 m_unk58; + short m_unk5c; + unsigned char m_flags; + int m_unk60; }; #endif // MXVIDEOPRESENTER_H diff --git a/LEGO1/mxwavepresenter.cpp b/LEGO1/mxwavepresenter.cpp index bfd69c5f..cba9106e 100644 --- a/LEGO1/mxwavepresenter.cpp +++ b/LEGO1/mxwavepresenter.cpp @@ -1,7 +1,18 @@ #include "mxwavepresenter.h" -// OFFSET: LEGO1 0x100b1ad0 STUB +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxWavePresenter, 0x6c); + +// OFFSET: LEGO1 0x100b1ad0 void MxWavePresenter::Init() { - // TODO + m_unk54 = 0; + m_unk58 = 0; + m_unk5c = 0; + m_unk60 = 0; + m_unk64 = 0; + m_unk65 = 0; + m_unk66 = 0; + m_unk68 = 0; } diff --git a/LEGO1/mxwavepresenter.h b/LEGO1/mxwavepresenter.h index c00d978d..a8a1de45 100644 --- a/LEGO1/mxwavepresenter.h +++ b/LEGO1/mxwavepresenter.h @@ -3,14 +3,28 @@ #include "mxsoundpresenter.h" +#include "decomp.h" + // VTABLE 0x100d49a8 // SIZE 0x6c class MxWavePresenter : public MxSoundPresenter { private: void Init(); - + public: + MxWavePresenter() { + Init(); + } + undefined4 m_unk54; + undefined4 m_unk58; + undefined4 m_unk5c; + undefined4 m_unk60; + undefined m_unk64; + undefined m_unk65; + undefined m_unk66; + undefined m_unk67; + undefined m_unk68; }; #endif // MXWAVEPRESENTER_H From b91c7d436babc48b812f6e2874072afc67ef52ea Mon Sep 17 00:00:00 2001 From: Kai Kaufman <92912278+ktkaufman03@users.noreply.github.com> Date: Sun, 2 Jul 2023 03:51:57 -0400 Subject: [PATCH 28/34] fix: MxDSFile::Open is now matching 100% (#69) --- LEGO1/mxdsfile.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/LEGO1/mxdsfile.cpp b/LEGO1/mxdsfile.cpp index 327fab46..3e587b07 100644 --- a/LEGO1/mxdsfile.cpp +++ b/LEGO1/mxdsfile.cpp @@ -23,16 +23,15 @@ MxDSFile::~MxDSFile() // OFFSET: LEGO1 0x100cc590 long MxDSFile::Open(unsigned long uStyle) { - // No idea what's stopping this one matching, but I'm pretty - // confident it has the correct behavior. + MXIOINFO& io = m_io; long longResult = 1; - memset(&m_io, 0, sizeof(MXIOINFO)); + memset(&io, 0, sizeof(MXIOINFO)); - if (m_io.Open(m_filename.GetData(), uStyle) != 0) { + if (io.Open(m_filename.GetData(), uStyle) != 0) { return -1; } - m_io.SetBuffer(NULL, 0, 0); + io.SetBuffer(NULL, 0, 0); m_position = 0; if (m_skipReadingChunks == 0) { From 0555e0575658f64f4976f7b823d774c710d7ff01 Mon Sep 17 00:00:00 2001 From: Kai Kaufman <92912278+ktkaufman03@users.noreply.github.com> Date: Sun, 2 Jul 2023 04:02:05 -0400 Subject: [PATCH 29/34] fix: ConvertHSVToRGB is effectively 100% matching (#70) --- LEGO1/legoutil.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/LEGO1/legoutil.cpp b/LEGO1/legoutil.cpp index 58e11e8f..5ea567e8 100644 --- a/LEGO1/legoutil.cpp +++ b/LEGO1/legoutil.cpp @@ -9,10 +9,13 @@ void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, floa double v9; double v12; double v13; + + double s_dbl = s; + if (s > 0.5f) calc = (1.0f - v) * s + v; else - calc = (v + 1.0) * s; + calc = (v + 1.0) * s_dbl; if (calc <= 0.0) { *g_out = 0.0f; @@ -20,7 +23,7 @@ void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, floa *r_out = 0.0f; return; } - p = s * 2.0 - calc; + p = s * 2.0f - calc; hue_index = h * 6.0; v9 = (h * 6.0 - (float)hue_index) * ((calc - p) / calc) * calc; v12 = p + v9; From e16249b6726eb649ad4684c8c980c214ade9107b Mon Sep 17 00:00:00 2001 From: MattKC <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 2 Jul 2023 01:05:49 -0700 Subject: [PATCH 30/34] Define MxLong/MxULong (#71) * define MxLong/MxULong The "long" type has different sizes on different platforms, and this may cause issues. * use DWORD to match RegQueryValueExA arg --- ISLE/define.cpp | 2 +- ISLE/define.h | 3 ++- ISLE/isleapp.cpp | 6 +++--- ISLE/isleapp.h | 2 +- LEGO1/act2brick.cpp | 4 ++-- LEGO1/act2brick.h | 4 ++-- LEGO1/act2policestation.cpp | 2 +- LEGO1/act2policestation.h | 2 +- LEGO1/beachhouseentity.cpp | 2 +- LEGO1/beachhouseentity.h | 2 +- LEGO1/elevatorbottom.cpp | 2 +- LEGO1/elevatorbottom.h | 2 +- LEGO1/gasstation.cpp | 4 ++-- LEGO1/gasstation.h | 4 ++-- LEGO1/historybook.cpp | 2 +- LEGO1/historybook.h | 2 +- LEGO1/hospital.cpp | 2 +- LEGO1/hospital.h | 2 +- LEGO1/infocenter.cpp | 4 ++-- LEGO1/infocenter.h | 4 ++-- LEGO1/infocenterdoor.cpp | 2 +- LEGO1/infocenterdoor.h | 2 +- LEGO1/legoanimationmanager.cpp | 4 ++-- LEGO1/legoanimationmanager.h | 4 ++-- LEGO1/legocarbuild.cpp | 4 ++-- LEGO1/legocarbuild.h | 4 ++-- LEGO1/legocontrolmanager.cpp | 2 +- LEGO1/legocontrolmanager.h | 2 +- LEGO1/legoentity.cpp | 2 +- LEGO1/legoentity.h | 2 +- LEGO1/legogamestate.cpp | 4 ++-- LEGO1/legogamestate.h | 6 ++++-- LEGO1/legoinputmanager.cpp | 4 ++-- LEGO1/legoinputmanager.h | 4 ++-- LEGO1/legoomni.cpp | 10 +++++----- LEGO1/legoomni.h | 12 ++++++------ LEGO1/legopathcontroller.cpp | 2 +- LEGO1/legopathcontroller.h | 2 +- LEGO1/legoplantmanager.cpp | 2 +- LEGO1/legoplantmanager.h | 2 +- LEGO1/legorace.cpp | 2 +- LEGO1/legorace.h | 2 +- LEGO1/legosoundmanager.cpp | 2 +- LEGO1/legosoundmanager.h | 2 +- LEGO1/legoutil.cpp | 6 ++++-- LEGO1/mxbitmap.cpp | 2 +- LEGO1/mxbitmap.h | 2 +- LEGO1/mxcore.cpp | 4 ++-- LEGO1/mxcore.h | 4 ++-- LEGO1/mxdiskstreamcontroller.cpp | 2 +- LEGO1/mxdiskstreamcontroller.h | 2 +- LEGO1/mxdsfile.cpp | 20 ++++++++++---------- LEGO1/mxdsfile.h | 20 ++++++++++---------- LEGO1/mxdssource.cpp | 2 +- LEGO1/mxdssource.h | 18 +++++++++--------- LEGO1/mxioinfo.cpp | 4 ++-- LEGO1/mxioinfo.h | 7 ++++--- LEGO1/mxmediapresenter.cpp | 2 +- LEGO1/mxmediapresenter.h | 2 +- LEGO1/mxnotificationmanager.cpp | 2 +- LEGO1/mxnotificationmanager.h | 2 +- LEGO1/mxomni.cpp | 2 +- LEGO1/mxomni.h | 2 +- LEGO1/mxpresenter.cpp | 4 ++-- LEGO1/mxpresenter.h | 4 ++-- LEGO1/mxscheduler.cpp | 2 +- LEGO1/mxscheduler.h | 4 +++- LEGO1/mxstreamer.cpp | 4 ++-- LEGO1/mxstreamer.h | 4 ++-- LEGO1/mxticklemanager.h | 2 +- LEGO1/mxtimer.cpp | 10 +++++----- LEGO1/mxtimer.h | 10 +++++----- LEGO1/mxtransitionmanager.cpp | 2 +- LEGO1/mxtransitionmanager.h | 2 +- LEGO1/mxtypes.h | 21 +++++++++++++++++---- LEGO1/mxvideomanager.cpp | 4 ++-- LEGO1/mxvideomanager.h | 4 ++-- LEGO1/mxvideoparam.cpp | 2 +- LEGO1/mxvideoparam.h | 2 +- LEGO1/police.cpp | 2 +- LEGO1/police.h | 2 +- LEGO1/registrationbook.cpp | 2 +- LEGO1/registrationbook.h | 2 +- LEGO1/score.cpp | 2 +- LEGO1/score.h | 2 +- 85 files changed, 180 insertions(+), 159 deletions(-) diff --git a/ISLE/define.cpp b/ISLE/define.cpp index f236ea29..61de399e 100644 --- a/ISLE/define.cpp +++ b/ISLE/define.cpp @@ -37,4 +37,4 @@ int g_reqEnableRMDevice = 0; int g_startupDelay = 200; // 0x4101c0 -long g_lastFrameTime = 0; +MxLong g_lastFrameTime = 0; diff --git a/ISLE/define.h b/ISLE/define.h index ffc74654..ff2a4c2f 100644 --- a/ISLE/define.h +++ b/ISLE/define.h @@ -1,6 +1,7 @@ #ifndef DEFINE_H #define DEFINE_H +#include #include class IsleApp; @@ -21,6 +22,6 @@ extern int g_targetHeight; extern int g_targetDepth; extern int g_reqEnableRMDevice; extern int g_startupDelay; -extern long g_lastFrameTime; +extern MxLong g_lastFrameTime; #endif // DEFINE_H diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index 3697e816..a1836e8c 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -95,7 +95,7 @@ void IsleApp::Close() TransitionManager()->SetWaitIndicator(NULL); Lego()->vtable3c(); - long lVar8; + MxLong lVar8; do { lVar8 = Streamer()->Close(NULL); } while (lVar8 == 0); @@ -571,7 +571,7 @@ BOOL IsleApp::ReadReg(LPCSTR name, LPSTR outValue, DWORD outSize) DWORD valueType; BOOL out = FALSE; - unsigned long size = outSize; + DWORD size = outSize; if (RegOpenKeyExA(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 (RegCloseKey(hKey) == ERROR_SUCCESS) { @@ -695,7 +695,7 @@ inline void IsleApp::Tick(BOOL sleepIfNotNextFrame) if (!TickleManager()) return; if (!Timer()) return; - long currentTime = Timer()->GetRealTime(); + MxLong currentTime = Timer()->GetRealTime(); if (currentTime < g_lastFrameTime) { g_lastFrameTime = -this->m_frameDelta; } diff --git a/ISLE/isleapp.h b/ISLE/isleapp.h index d31c6f42..a622697a 100644 --- a/ISLE/isleapp.h +++ b/ISLE/isleapp.h @@ -56,7 +56,7 @@ class IsleApp // 40 int m_islandTexture; int m_gameStarted; - long m_frameDelta; + MxLong m_frameDelta; // 4c MxVideoParam m_videoParam; diff --git a/LEGO1/act2brick.cpp b/LEGO1/act2brick.cpp index 4bb2f3f9..84c8bbb3 100644 --- a/LEGO1/act2brick.cpp +++ b/LEGO1/act2brick.cpp @@ -13,7 +13,7 @@ Act2Brick::~Act2Brick() } // STUB OFFSET: LEGO1 0x1007a8c0 STUB -long Act2Brick::Notify(MxParam &p) +MxLong Act2Brick::Notify(MxParam &p) { // TODO @@ -21,7 +21,7 @@ long Act2Brick::Notify(MxParam &p) } // OFFSET: LEGO1 0x1007a7f0 STUB -long Act2Brick::Tickle() +MxLong Act2Brick::Tickle() { // TODO diff --git a/LEGO1/act2brick.h b/LEGO1/act2brick.h index fd10a997..bf909198 100644 --- a/LEGO1/act2brick.h +++ b/LEGO1/act2brick.h @@ -11,8 +11,8 @@ class Act2Brick : public LegoPathActor Act2Brick(); virtual ~Act2Brick() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 - virtual long Tickle() override; // vtable+0x08 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Tickle() override; // vtable+0x08 // OFFSET: LEGO1 0x1007a360 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/act2policestation.cpp b/LEGO1/act2policestation.cpp index 14f69db4..32c15e3e 100644 --- a/LEGO1/act2policestation.cpp +++ b/LEGO1/act2policestation.cpp @@ -1,7 +1,7 @@ #include "act2policestation.h" // OFFSET: LEGO1 0x1004e0e0 STUB -long Act2PoliceStation::Notify(MxParam &p) +MxLong Act2PoliceStation::Notify(MxParam &p) { // TODO diff --git a/LEGO1/act2policestation.h b/LEGO1/act2policestation.h index e935e252..7b0ea9c5 100644 --- a/LEGO1/act2policestation.h +++ b/LEGO1/act2policestation.h @@ -8,7 +8,7 @@ class Act2PoliceStation : public LegoEntity { public: - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 // OFFSET: LEGO1 0x1000e200 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/beachhouseentity.cpp b/LEGO1/beachhouseentity.cpp index 029e022f..4ccf5777 100644 --- a/LEGO1/beachhouseentity.cpp +++ b/LEGO1/beachhouseentity.cpp @@ -1,7 +1,7 @@ #include "beachhouseentity.h" // OFFSET: LEGO1 0x100150a0 STUB -long BeachHouseEntity::Notify(MxParam &p) +MxLong BeachHouseEntity::Notify(MxParam &p) { // TODO diff --git a/LEGO1/beachhouseentity.h b/LEGO1/beachhouseentity.h index 1749ff54..77555a81 100644 --- a/LEGO1/beachhouseentity.h +++ b/LEGO1/beachhouseentity.h @@ -8,7 +8,7 @@ class BeachHouseEntity : public BuildingEntity { public: - virtual long Notify(MxParam &p) override; // vtable+04 + virtual MxLong Notify(MxParam &p) override; // vtable+04 // OFFSET: LEGO1 0x1000ee80 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/elevatorbottom.cpp b/LEGO1/elevatorbottom.cpp index d216fe35..048ecbba 100644 --- a/LEGO1/elevatorbottom.cpp +++ b/LEGO1/elevatorbottom.cpp @@ -13,7 +13,7 @@ ElevatorBottom::~ElevatorBottom() } // OFFSET: LEGO1 0x10018150 STUB -long ElevatorBottom::Notify(MxParam &p) +MxLong ElevatorBottom::Notify(MxParam &p) { // TODO diff --git a/LEGO1/elevatorbottom.h b/LEGO1/elevatorbottom.h index 0d86080a..e6a56836 100644 --- a/LEGO1/elevatorbottom.h +++ b/LEGO1/elevatorbottom.h @@ -10,7 +10,7 @@ class ElevatorBottom : public LegoWorld ElevatorBottom(); virtual ~ElevatorBottom() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 // OFFSET: LEGO1 0x10017f20 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/gasstation.cpp b/LEGO1/gasstation.cpp index d50ef317..33590dc9 100644 --- a/LEGO1/gasstation.cpp +++ b/LEGO1/gasstation.cpp @@ -13,7 +13,7 @@ GasStation::~GasStation() } // OFFSET: LEGO1 0x10004a60 STUB -long GasStation::Notify(MxParam &p) +MxLong GasStation::Notify(MxParam &p) { // TODO @@ -21,7 +21,7 @@ long GasStation::Notify(MxParam &p) } // OFFSET: LEGO1 0x10005c90 STUB -long GasStation::Tickle() +MxLong GasStation::Tickle() { // TODO diff --git a/LEGO1/gasstation.h b/LEGO1/gasstation.h index 9f22ca3f..7f2263d0 100644 --- a/LEGO1/gasstation.h +++ b/LEGO1/gasstation.h @@ -12,8 +12,8 @@ class GasStation : public LegoWorld GasStation(); virtual ~GasStation() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Tickle() override; // vtable+0x8 // OFFSET: LEGO1 0x10004780 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/historybook.cpp b/LEGO1/historybook.cpp index 89c81315..1666cc9d 100644 --- a/LEGO1/historybook.cpp +++ b/LEGO1/historybook.cpp @@ -13,7 +13,7 @@ HistoryBook::~HistoryBook() } // OFFSET: LEGO1 0x10082680 STUB -long HistoryBook::Notify(MxParam &p) +MxLong HistoryBook::Notify(MxParam &p) { // TODO diff --git a/LEGO1/historybook.h b/LEGO1/historybook.h index bbdc6246..2fdcee78 100644 --- a/LEGO1/historybook.h +++ b/LEGO1/historybook.h @@ -11,7 +11,7 @@ class HistoryBook : public LegoWorld HistoryBook(); virtual ~HistoryBook() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 // OFFSET: LEGO1 0x10082390 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/hospital.cpp b/LEGO1/hospital.cpp index 2581cf34..9f84d7ce 100644 --- a/LEGO1/hospital.cpp +++ b/LEGO1/hospital.cpp @@ -13,7 +13,7 @@ Hospital::~Hospital() } // OFFSET: LEGO1 0x10074990 STUB -long Hospital::Notify(MxParam &p) +MxLong Hospital::Notify(MxParam &p) { // TODO diff --git a/LEGO1/hospital.h b/LEGO1/hospital.h index b14de205..bcce9823 100644 --- a/LEGO1/hospital.h +++ b/LEGO1/hospital.h @@ -11,7 +11,7 @@ class Hospital : public LegoWorld Hospital(); virtual ~Hospital() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x04 + virtual MxLong Notify(MxParam &p) override; // vtable+0x04 // OFFSET: LEGO1 0x100746b0 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/infocenter.cpp b/LEGO1/infocenter.cpp index 1ad07ee4..b9ea67c6 100644 --- a/LEGO1/infocenter.cpp +++ b/LEGO1/infocenter.cpp @@ -13,7 +13,7 @@ Infocenter::~Infocenter() } // OFFSET: LEGO1 0x1006ef10 STUB -long Infocenter::Notify(MxParam &p) +MxLong Infocenter::Notify(MxParam &p) { // TODO @@ -21,7 +21,7 @@ long Infocenter::Notify(MxParam &p) } // OFFSET: LEGO1 0x10070af0 STUB -long Infocenter::Tickle() +MxLong Infocenter::Tickle() { // TODO diff --git a/LEGO1/infocenter.h b/LEGO1/infocenter.h index 49a71acb..a6e06f0f 100644 --- a/LEGO1/infocenter.h +++ b/LEGO1/infocenter.h @@ -11,8 +11,8 @@ class Infocenter : public LegoWorld Infocenter(); virtual ~Infocenter() override; - virtual long Notify(MxParam &p) override; // vtable+0x4 - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Tickle() override; // vtable+0x8 // OFFSET: LEGO1 0x1006eb40 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/infocenterdoor.cpp b/LEGO1/infocenterdoor.cpp index be57f96e..20e01771 100644 --- a/LEGO1/infocenterdoor.cpp +++ b/LEGO1/infocenterdoor.cpp @@ -13,7 +13,7 @@ InfocenterDoor::~InfocenterDoor() } // OFFSET: LEGO1 0x100379e0 STUB -long InfocenterDoor::Notify(MxParam &p) +MxLong InfocenterDoor::Notify(MxParam &p) { // TODO diff --git a/LEGO1/infocenterdoor.h b/LEGO1/infocenterdoor.h index 77a0c021..0692fbca 100644 --- a/LEGO1/infocenterdoor.h +++ b/LEGO1/infocenterdoor.h @@ -11,7 +11,7 @@ class InfocenterDoor : public LegoWorld InfocenterDoor(); virtual ~InfocenterDoor(); // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 // OFFSET: LEGO1 0x100377b0 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/legoanimationmanager.cpp b/LEGO1/legoanimationmanager.cpp index c25aa436..d396d431 100644 --- a/LEGO1/legoanimationmanager.cpp +++ b/LEGO1/legoanimationmanager.cpp @@ -15,7 +15,7 @@ LegoAnimationManager::~LegoAnimationManager() } // OFFSET: LEGO1 0x100619f0 STUB -long LegoAnimationManager::Notify(MxParam &p) +MxLong LegoAnimationManager::Notify(MxParam &p) { // TODO @@ -23,7 +23,7 @@ long LegoAnimationManager::Notify(MxParam &p) } // OFFSET: LEGO1 0x10061cc0 STUB -long LegoAnimationManager::Tickle() +MxLong LegoAnimationManager::Tickle() { // TODO diff --git a/LEGO1/legoanimationmanager.h b/LEGO1/legoanimationmanager.h index c42b7715..49b95f94 100644 --- a/LEGO1/legoanimationmanager.h +++ b/LEGO1/legoanimationmanager.h @@ -11,8 +11,8 @@ class LegoAnimationManager : public MxCore LegoAnimationManager(); virtual ~LegoAnimationManager() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Tickle() override; // vtable+0x8 // OFFSET: LEGO1 0x1005ec80 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/legocarbuild.cpp b/LEGO1/legocarbuild.cpp index d96668e4..c9254c37 100644 --- a/LEGO1/legocarbuild.cpp +++ b/LEGO1/legocarbuild.cpp @@ -13,7 +13,7 @@ LegoCarBuild::~LegoCarBuild() } // OFFSET: LEGO1 0x10024050 STUB -long LegoCarBuild::Notify(MxParam &p) +MxLong LegoCarBuild::Notify(MxParam &p) { // TODO @@ -21,7 +21,7 @@ long LegoCarBuild::Notify(MxParam &p) } // OFFSET: LEGO1 0x100238b0 STUB -long LegoCarBuild::Tickle() +MxLong LegoCarBuild::Tickle() { // TODO diff --git a/LEGO1/legocarbuild.h b/LEGO1/legocarbuild.h index 10396c9e..d320cd6e 100644 --- a/LEGO1/legocarbuild.h +++ b/LEGO1/legocarbuild.h @@ -11,8 +11,8 @@ class LegoCarBuild : public LegoWorld LegoCarBuild(); virtual ~LegoCarBuild() override; - virtual long Notify(MxParam &p) override; // vtable+0x4 - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Tickle() override; // vtable+0x8 // OFFSET: LEGO1 0x10022940 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/legocontrolmanager.cpp b/LEGO1/legocontrolmanager.cpp index 0959df9c..16733e13 100644 --- a/LEGO1/legocontrolmanager.cpp +++ b/LEGO1/legocontrolmanager.cpp @@ -13,7 +13,7 @@ LegoControlManager::~LegoControlManager() } // OFFSET: LEGO1 0x10029600 STUB -long LegoControlManager::Tickle() +MxLong LegoControlManager::Tickle() { // TODO diff --git a/LEGO1/legocontrolmanager.h b/LEGO1/legocontrolmanager.h index d3e183fd..c4563776 100644 --- a/LEGO1/legocontrolmanager.h +++ b/LEGO1/legocontrolmanager.h @@ -10,7 +10,7 @@ class LegoControlManager : public MxCore LegoControlManager(); virtual ~LegoControlManager() override; // vtable+0x0 - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Tickle() override; // vtable+0x8 // OFFSET: LEGO1 0x10028cb0 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/legoentity.cpp b/LEGO1/legoentity.cpp index fe500cb7..b79bc587 100644 --- a/LEGO1/legoentity.cpp +++ b/LEGO1/legoentity.cpp @@ -7,7 +7,7 @@ LegoEntity::~LegoEntity() } // OFFSET: LEGO1 0x100114f0 STUB -long LegoEntity::Notify(MxParam &p) +MxLong LegoEntity::Notify(MxParam &p) { // TODO diff --git a/LEGO1/legoentity.h b/LEGO1/legoentity.h index 774b19f2..46aea940 100644 --- a/LEGO1/legoentity.h +++ b/LEGO1/legoentity.h @@ -15,7 +15,7 @@ class LegoEntity : public MxEntity __declspec(dllexport) virtual ~LegoEntity() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 // OFFSET: LEGO1 0x1000c2f0 inline const char *ClassName() const override // vtable+0xc diff --git a/LEGO1/legogamestate.cpp b/LEGO1/legogamestate.cpp index 473003a7..66873f12 100644 --- a/LEGO1/legogamestate.cpp +++ b/LEGO1/legogamestate.cpp @@ -13,14 +13,14 @@ LegoGameState::~LegoGameState() } // OFFSET: LEGO1 0x10039c60 -long LegoGameState::Load(unsigned long) +MxResult LegoGameState::Load(MxULong) { // TODO return 0; } // OFFSET: LEGO1 0x10039980 -long LegoGameState::Save(unsigned long p) +MxResult LegoGameState::Save(MxULong p) { // TODO return 0; diff --git a/LEGO1/legogamestate.h b/LEGO1/legogamestate.h index 239719eb..fdd5bcb1 100644 --- a/LEGO1/legogamestate.h +++ b/LEGO1/legogamestate.h @@ -1,13 +1,15 @@ #ifndef LEGOGAMESTATE_H #define LEGOGAMESTATE_H +#include "mxtypes.h" + class LegoGameState { public: __declspec(dllexport) LegoGameState(); __declspec(dllexport) ~LegoGameState(); - __declspec(dllexport) long Load(unsigned long); - __declspec(dllexport) long Save(unsigned long p); + __declspec(dllexport) MxResult Load(MxULong); + __declspec(dllexport) MxResult Save(MxULong p); __declspec(dllexport) void SerializePlayersInfo(short p); __declspec(dllexport) void SerializeScoreHistory(short p); __declspec(dllexport) void SetSavePath(char *p); diff --git a/LEGO1/legoinputmanager.cpp b/LEGO1/legoinputmanager.cpp index 6c0bd709..90be0c2c 100644 --- a/LEGO1/legoinputmanager.cpp +++ b/LEGO1/legoinputmanager.cpp @@ -17,7 +17,7 @@ LegoInputManager::~LegoInputManager() } // OFFSET: LEGO1 0x1005c740 STUB -void LegoInputManager::QueueEvent(NotificationId id, unsigned char p2, long p3, long p4, unsigned char p5) +void LegoInputManager::QueueEvent(NotificationId id, unsigned char p2, MxLong p3, MxLong p4, unsigned char p5) { // TODO } @@ -35,7 +35,7 @@ void LegoInputManager::UnRegister(MxCore *) } // OFFSET: LEGO1 0x1005b8b0 STUB -long LegoInputManager::Tickle() +MxLong LegoInputManager::Tickle() { // TODO diff --git a/LEGO1/legoinputmanager.h b/LEGO1/legoinputmanager.h index 74a2a8fa..7ae2dd62 100644 --- a/LEGO1/legoinputmanager.h +++ b/LEGO1/legoinputmanager.h @@ -22,11 +22,11 @@ class LegoInputManager : public MxPresenter LegoInputManager(); virtual ~LegoInputManager() override; - __declspec(dllexport) void QueueEvent(NotificationId id, unsigned char p2, long p3, long p4, unsigned char p5); + __declspec(dllexport) void QueueEvent(NotificationId id, unsigned char p2, MxLong p3, MxLong p4, unsigned char p5); __declspec(dllexport) void Register(MxCore *); __declspec(dllexport) void UnRegister(MxCore *); - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Tickle() override; // vtable+0x8 undefined m_pad40[0x15c]; int m_joystickIndex; diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 45f7a9f7..32fb4d7f 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -25,7 +25,7 @@ void LegoOmni::CreateBackgroundAudio() } // OFFSET: LEGO1 0x1005af10 STUB -void LegoOmni::RemoveWorld(const MxAtomId &p1, long p2) +void LegoOmni::RemoveWorld(const MxAtomId &p1, MxLong p2) { // TODO } @@ -50,7 +50,7 @@ void SetOmniUserMessage(void (*p_userMsg)(const char *,int)) } // OFFSET: LEGO1 0x100acf50 STUB -long Start(MxDSAction *) +MxLong Start(MxDSAction *) { // TODO return 0; @@ -149,21 +149,21 @@ const char *GetNoCD_SourceName() } // OFFSET: LEGO1 0x1005b5f0 -long LegoOmni::Notify(MxParam &p) +MxLong LegoOmni::Notify(MxParam &p) { // FIXME: Stub return 0; } // OFFSET: LEGO1 0x1003dd70 STUB -LegoROI *PickROI(long,long) +LegoROI *PickROI(MxLong,MxLong) { // TODO return NULL; } // OFFSET: LEGO1 0x1003ddc0 STUB -LegoEntity *PickEntity(long,long) +LegoEntity *PickEntity(MxLong,MxLong) { // TODO return NULL; diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 512fba41..9c8df71f 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -28,7 +28,7 @@ class LegoOmni : public MxOmni { public: __declspec(dllexport) void CreateBackgroundAudio(); - __declspec(dllexport) void RemoveWorld(const MxAtomId &p1, long p2); + __declspec(dllexport) void RemoveWorld(const MxAtomId &p1, MxLong p2); __declspec(dllexport) static int GetCurrPathInfo(LegoPathBoundary **,int &); __declspec(dllexport) static void CreateInstance(); __declspec(dllexport) static LegoOmni *GetInstance(); @@ -36,7 +36,7 @@ class LegoOmni : public MxOmni LegoOmni(); virtual ~LegoOmni(); // vtable+00 - virtual long Notify(MxParam &p); // vtable+04 + virtual MxLong Notify(MxParam &p); // vtable+04 // OFFSET: LEGO1 0x10058aa0 inline virtual const char *ClassName() const // vtable+0c @@ -101,14 +101,14 @@ __declspec(dllexport) const char * GetNoCD_SourceName(); __declspec(dllexport) LegoInputManager * InputManager(); __declspec(dllexport) LegoOmni * Lego(); __declspec(dllexport) void MakeSourceName(char *, const char *); -__declspec(dllexport) LegoEntity * PickEntity(long,long); -__declspec(dllexport) LegoROI * PickROI(long,long); +__declspec(dllexport) LegoEntity * PickEntity(MxLong,MxLong); +__declspec(dllexport) LegoROI * PickROI(MxLong,MxLong); __declspec(dllexport) void SetOmniUserMessage(void (*)(const char *,int)); __declspec(dllexport) LegoSoundManager * SoundManager(); -__declspec(dllexport) long Start(MxDSAction *); +__declspec(dllexport) MxLong Start(MxDSAction *); __declspec(dllexport) MxTransitionManager * TransitionManager(); __declspec(dllexport) LegoVideoManager * VideoManager(); -__declspec(dllexport) long Start(MxDSAction *a); +__declspec(dllexport) MxLong Start(MxDSAction *a); LegoBuildingManager* BuildingManager(); Isle* GetIsle(); diff --git a/LEGO1/legopathcontroller.cpp b/LEGO1/legopathcontroller.cpp index 46e23f5e..0cebbc0f 100644 --- a/LEGO1/legopathcontroller.cpp +++ b/LEGO1/legopathcontroller.cpp @@ -13,7 +13,7 @@ LegoPathController::~LegoPathController() } // OFFSET: LEGO1 0x10045c10 STUB -long LegoPathController::Tickle() +MxLong LegoPathController::Tickle() { // TODO return 0; diff --git a/LEGO1/legopathcontroller.h b/LEGO1/legopathcontroller.h index 9686b2bd..ba415076 100644 --- a/LEGO1/legopathcontroller.h +++ b/LEGO1/legopathcontroller.h @@ -11,7 +11,7 @@ class LegoPathController : public MxCore LegoPathController(); virtual ~LegoPathController() override; - virtual long Tickle() override; // vtable+08 + virtual MxLong Tickle() override; // vtable+08 // OFFSET: LEGO1 0x10045110 inline const char *ClassName() const override // vtable+0xc diff --git a/LEGO1/legoplantmanager.cpp b/LEGO1/legoplantmanager.cpp index 8f67b939..eee83726 100644 --- a/LEGO1/legoplantmanager.cpp +++ b/LEGO1/legoplantmanager.cpp @@ -13,7 +13,7 @@ LegoPlantManager::~LegoPlantManager() } // OFFSET: LEGO1 0x10026e00 STUB -long LegoPlantManager::Tickle() +MxLong LegoPlantManager::Tickle() { // TODO diff --git a/LEGO1/legoplantmanager.h b/LEGO1/legoplantmanager.h index 272fb451..3e8bfefe 100644 --- a/LEGO1/legoplantmanager.h +++ b/LEGO1/legoplantmanager.h @@ -11,7 +11,7 @@ class LegoPlantManager : public MxCore LegoPlantManager(); virtual ~LegoPlantManager() override; // vtable+0x0 - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Tickle() override; // vtable+0x8 // OFFSET: LEGO1 0x10026290 inline const char *ClassName() const override // vtable+0xc diff --git a/LEGO1/legorace.cpp b/LEGO1/legorace.cpp index 888b1fe1..2b2e3390 100644 --- a/LEGO1/legorace.cpp +++ b/LEGO1/legorace.cpp @@ -13,7 +13,7 @@ LegoRace::~LegoRace() } // OFFSET: LEGO1 0x10015e00 STUB -long LegoRace::Notify(MxParam &p) +MxLong LegoRace::Notify(MxParam &p) { // TODO diff --git a/LEGO1/legorace.h b/LEGO1/legorace.h index 003e57ed..26c88b9b 100644 --- a/LEGO1/legorace.h +++ b/LEGO1/legorace.h @@ -10,7 +10,7 @@ class LegoRace : public LegoWorld LegoRace(); virtual ~LegoRace() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 // OFFSET: LEGO1 0x10015ba0 inline const char *ClassName() const override // vtable+0xc diff --git a/LEGO1/legosoundmanager.cpp b/LEGO1/legosoundmanager.cpp index 518b8c55..e56747f6 100644 --- a/LEGO1/legosoundmanager.cpp +++ b/LEGO1/legosoundmanager.cpp @@ -13,7 +13,7 @@ LegoSoundManager::~LegoSoundManager() } // OFFSET: LEGO1 0x1002a3a0 STUB -long LegoSoundManager::Tickle() +MxLong LegoSoundManager::Tickle() { // TODO return 0; diff --git a/LEGO1/legosoundmanager.h b/LEGO1/legosoundmanager.h index 9b1e6450..1d191e03 100644 --- a/LEGO1/legosoundmanager.h +++ b/LEGO1/legosoundmanager.h @@ -10,7 +10,7 @@ class LegoSoundManager : public MxSoundManager public: LegoSoundManager(); virtual ~LegoSoundManager() override; - virtual long Tickle() override; // vtable+08 + virtual MxLong Tickle() override; // vtable+08 private: void Init(); diff --git a/LEGO1/legoutil.cpp b/LEGO1/legoutil.cpp index 5ea567e8..bac8f284 100644 --- a/LEGO1/legoutil.cpp +++ b/LEGO1/legoutil.cpp @@ -1,11 +1,13 @@ #include "legoutil.h" +#include "mxtypes.h" + // OFFSET: LEGO1 0x1003eae0 void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out) { double calc; double p; - long hue_index; + MxLong hue_index; double v9; double v12; double v13; @@ -68,4 +70,4 @@ void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, floa default: return; } -} \ No newline at end of file +} diff --git a/LEGO1/mxbitmap.cpp b/LEGO1/mxbitmap.cpp index 2ccdd80b..6ad26f94 100644 --- a/LEGO1/mxbitmap.cpp +++ b/LEGO1/mxbitmap.cpp @@ -47,7 +47,7 @@ MxResult MxBitmap::LoadFile(HANDLE p_handle) } // OFFSET: LEGO1 0x100bcd10 -long MxBitmap::Read(const char *p_filename) +MxLong MxBitmap::Read(const char *p_filename) { MxResult result = FAILURE; HANDLE handle = CreateFileA( diff --git a/LEGO1/mxbitmap.h b/LEGO1/mxbitmap.h index e16fcb0e..66550f7e 100644 --- a/LEGO1/mxbitmap.h +++ b/LEGO1/mxbitmap.h @@ -17,7 +17,7 @@ class MxBitmap : public MxCore virtual int vtable18(BITMAPINFOHEADER *p_bmiHeader); virtual int vtable1c(int p_width, int p_height, MxPalette *p_palette, int); virtual MxResult LoadFile(HANDLE p_handle); - __declspec(dllexport) virtual long Read(const char *p_filename); // vtable+24 + __declspec(dllexport) virtual MxLong Read(const char *p_filename); // vtable+24 virtual int vtable28(int); virtual void vtable2c(int, int, int, int, int, int, int); virtual void vtable30(int, int, int, int, int, int, int); diff --git a/LEGO1/mxcore.cpp b/LEGO1/mxcore.cpp index aec24c00..78441d8d 100644 --- a/LEGO1/mxcore.cpp +++ b/LEGO1/mxcore.cpp @@ -16,13 +16,13 @@ MxCore::~MxCore() } // OFFSET: LEGO1 0x100ae1f0 -long MxCore::Notify(MxParam &p) +MxLong MxCore::Notify(MxParam &p) { return 0; } // OFFSET: LEGO1 0x10001f70 -long MxCore::Tickle() +MxLong MxCore::Tickle() { return 0; } \ No newline at end of file diff --git a/LEGO1/mxcore.h b/LEGO1/mxcore.h index 446ee91e..5e6586ba 100644 --- a/LEGO1/mxcore.h +++ b/LEGO1/mxcore.h @@ -14,8 +14,8 @@ class MxCore public: __declspec(dllexport) MxCore(); __declspec(dllexport) virtual ~MxCore(); // vtable+00 - __declspec(dllexport) virtual long Notify(MxParam &p); // vtable+04 - virtual long Tickle(); // vtable+08 + __declspec(dllexport) virtual MxLong Notify(MxParam &p); // vtable+04 + virtual MxLong Tickle(); // vtable+08 // OFFSET: LEGO1 0x100144c0 inline virtual const char *ClassName() const // vtable+0c diff --git a/LEGO1/mxdiskstreamcontroller.cpp b/LEGO1/mxdiskstreamcontroller.cpp index c178c0a5..61243410 100644 --- a/LEGO1/mxdiskstreamcontroller.cpp +++ b/LEGO1/mxdiskstreamcontroller.cpp @@ -13,7 +13,7 @@ MxDiskStreamController::~MxDiskStreamController() } // OFFSET: LEGO1 0x100c8640 STUB -long MxDiskStreamController::Tickle() +MxLong MxDiskStreamController::Tickle() { // TODO diff --git a/LEGO1/mxdiskstreamcontroller.h b/LEGO1/mxdiskstreamcontroller.h index 773f6b85..c0142663 100644 --- a/LEGO1/mxdiskstreamcontroller.h +++ b/LEGO1/mxdiskstreamcontroller.h @@ -14,7 +14,7 @@ class MxDiskStreamController : public MxStreamController MxDiskStreamController(); virtual ~MxDiskStreamController() override; - virtual long Tickle() override; // vtable+0x8 + virtual MxLong Tickle() override; // vtable+0x8 // OFFSET: LEGO1 0x100c7360 inline virtual const char *ClassName() const override // vtable+0x0c diff --git a/LEGO1/mxdsfile.cpp b/LEGO1/mxdsfile.cpp index 3e587b07..60f8533e 100644 --- a/LEGO1/mxdsfile.cpp +++ b/LEGO1/mxdsfile.cpp @@ -8,7 +8,7 @@ #define FOURCC(a, b, c, d) (((a) << 0) | ((b) << 8) | ((c) << 16) | ((d) << 24)) // OFFSET: LEGO1 0x100cc4b0 -MxDSFile::MxDSFile(const char *filename, unsigned long skipReadingChunks) +MxDSFile::MxDSFile(const char *filename, MxULong skipReadingChunks) { m_filename = filename; m_skipReadingChunks = skipReadingChunks; @@ -21,10 +21,10 @@ MxDSFile::~MxDSFile() } // OFFSET: LEGO1 0x100cc590 -long MxDSFile::Open(unsigned long uStyle) +MxLong MxDSFile::Open(MxULong uStyle) { MXIOINFO& io = m_io; - long longResult = 1; + MxLong longResult = 1; memset(&io, 0, sizeof(MXIOINFO)); if (io.Open(m_filename.GetData(), uStyle) != 0) { @@ -49,7 +49,7 @@ long MxDSFile::Open(unsigned long uStyle) } // OFFSET: LEGO1 0x100cc780 -long MxDSFile::Read(unsigned char *pch, unsigned long cch) +MxLong MxDSFile::Read(unsigned char *pch, MxULong cch) { if (m_io.Read((char*)pch, cch) != cch) return -1; @@ -59,7 +59,7 @@ long MxDSFile::Read(unsigned char *pch, unsigned long cch) } // OFFSET: LEGO1 0x100cc620 -long MxDSFile::ReadChunks() +MxLong MxDSFile::ReadChunks() { _MMCKINFO topChunk; _MMCKINFO childChunk; @@ -81,7 +81,7 @@ long MxDSFile::ReadChunks() if (m_io.Descend(&childChunk, &topChunk, 0) != 0) { return -1; } - unsigned long* pLengthInDWords = &m_lengthInDWords; + MxULong* pLengthInDWords = &m_lengthInDWords; m_io.Read((char *)pLengthInDWords, 4); m_pBuffer = malloc(*pLengthInDWords * 4); m_io.Read((char*)m_pBuffer, *pLengthInDWords * 4); @@ -96,25 +96,25 @@ long MxDSFile::ReadChunks() } // OFFSET: LEGO1 0x100cc7b0 -long MxDSFile::Seek(long lOffset, int iOrigin) +MxLong MxDSFile::Seek(MxLong lOffset, int iOrigin) { return (m_position = m_io.Seek(lOffset, iOrigin)) == -1 ? -1 : 0; } // OFFSET: LEGO1 0x100cc7e0 -unsigned long MxDSFile::GetBufferSize() +MxULong MxDSFile::GetBufferSize() { return m_header.bufferSize; } // OFFSET: LEGO1 0x100cc7f0 -unsigned long MxDSFile::GetStreamBuffersNum() +MxULong MxDSFile::GetStreamBuffersNum() { return m_header.streamBuffersNum; } // OFFSET: LEGO1 0x100cc740 -long MxDSFile::Close() +MxLong MxDSFile::Close() { m_io.Close(0); m_position = -1; diff --git a/LEGO1/mxdsfile.h b/LEGO1/mxdsfile.h index 8e136984..ae44ff46 100644 --- a/LEGO1/mxdsfile.h +++ b/LEGO1/mxdsfile.h @@ -9,7 +9,7 @@ class MxDSFile : public MxDSSource { public: - __declspec(dllexport) MxDSFile(const char *filename, unsigned long skipReadingChunks); + __declspec(dllexport) MxDSFile(const char *filename, MxULong skipReadingChunks); __declspec(dllexport) virtual ~MxDSFile(); // vtable+0x0 // OFFSET: LEGO1 0x100c0120 @@ -25,14 +25,14 @@ class MxDSFile : public MxDSSource return !strcmp(name, MxDSFile::ClassName()) || MxDSSource::IsA(name); } - __declspec(dllexport) virtual long Open(unsigned long); // vtable+0x14 - __declspec(dllexport) virtual long Close(); // vtable+0x18 - __declspec(dllexport) virtual long Read(unsigned char *,unsigned long); // vtable+0x20 - __declspec(dllexport) virtual long Seek(long,int); // vtable+0x24 - __declspec(dllexport) virtual unsigned long GetBufferSize(); // vtable+0x28 - __declspec(dllexport) virtual unsigned long GetStreamBuffersNum(); // vtable+0x2c + __declspec(dllexport) virtual MxLong Open(MxULong); // vtable+0x14 + __declspec(dllexport) virtual MxLong Close(); // vtable+0x18 + __declspec(dllexport) virtual MxLong Read(unsigned char *,MxULong); // vtable+0x20 + __declspec(dllexport) virtual MxLong Seek(MxLong,int); // vtable+0x24 + __declspec(dllexport) virtual MxULong GetBufferSize(); // vtable+0x28 + __declspec(dllexport) virtual MxULong GetStreamBuffersNum(); // vtable+0x2c private: - long ReadChunks(); + MxLong ReadChunks(); struct ChunkHeader { ChunkHeader() : majorVersion(0) @@ -43,7 +43,7 @@ class MxDSFile : public MxDSSource unsigned short majorVersion; unsigned short minorVersion; - unsigned long bufferSize; + MxULong bufferSize; short streamBuffersNum; short reserved; }; @@ -54,7 +54,7 @@ class MxDSFile : public MxDSSource // If false, read chunks immediately on open, otherwise // skip reading chunks until ReadChunks is explicitly called. - unsigned long m_skipReadingChunks; + MxULong m_skipReadingChunks; }; #endif // MXDSFILE_H diff --git a/LEGO1/mxdssource.cpp b/LEGO1/mxdssource.cpp index 8612c5c4..9a94f110 100644 --- a/LEGO1/mxdssource.cpp +++ b/LEGO1/mxdssource.cpp @@ -8,7 +8,7 @@ void MxDSSource::SomethingWhichCallsRead(void* pUnknownObject) } // OFFSET: LEGO1 0x100bfff0 -long MxDSSource::GetLengthInDWords() +MxLong MxDSSource::GetLengthInDWords() { return m_lengthInDWords; } \ No newline at end of file diff --git a/LEGO1/mxdssource.h b/LEGO1/mxdssource.h index 2837e7c2..5ff4c33c 100644 --- a/LEGO1/mxdssource.h +++ b/LEGO1/mxdssource.h @@ -26,19 +26,19 @@ class MxDSSource : public MxCore return !strcmp(name, MxDSSource::ClassName()) || MxCore::IsA(name); } - virtual long Open(unsigned long) = 0; - virtual long Close() = 0; + virtual MxLong Open(MxULong) = 0; + virtual MxLong Close() = 0; virtual void SomethingWhichCallsRead(void* pUnknownObject); - virtual long Read(unsigned char *, unsigned long) = 0; - virtual long Seek(long, int) = 0; - virtual unsigned long GetBufferSize() = 0; - virtual unsigned long GetStreamBuffersNum() = 0; - virtual long GetLengthInDWords(); + virtual MxLong Read(unsigned char *, MxULong) = 0; + virtual MxLong Seek(MxLong, int) = 0; + virtual MxULong GetBufferSize() = 0; + virtual MxULong GetStreamBuffersNum() = 0; + virtual MxLong GetLengthInDWords(); protected: - unsigned long m_lengthInDWords; + MxULong m_lengthInDWords; void* m_pBuffer; - long m_position; + MxLong m_position; }; #endif // MXDSSOURCE_H diff --git a/LEGO1/mxioinfo.cpp b/LEGO1/mxioinfo.cpp index ebe2a480..d95a00ef 100644 --- a/LEGO1/mxioinfo.cpp +++ b/LEGO1/mxioinfo.cpp @@ -19,13 +19,13 @@ unsigned short MXIOINFO::Open(const char *filename, DWORD fdwOpen) } // OFFSET: LEGO1 0x100cc8e0 -void MXIOINFO::Close(long arg) +void MXIOINFO::Close(MxLong arg) { } // OFFSET: LEGO1 0x100cc930 -unsigned long MXIOINFO::Read(HPSTR pch, LONG cch) +MxULong MXIOINFO::Read(HPSTR pch, LONG cch) { return 0; } diff --git a/LEGO1/mxioinfo.h b/LEGO1/mxioinfo.h index c88a55b9..9556e5df 100644 --- a/LEGO1/mxioinfo.h +++ b/LEGO1/mxioinfo.h @@ -2,8 +2,9 @@ #define MXIOINFO_H #include +#include -#include "mmsystem.h" +#include "mxtypes.h" class MXIOINFO { @@ -12,9 +13,9 @@ class MXIOINFO __declspec(dllexport) ~MXIOINFO(); unsigned short Open(const char *filename, DWORD fdwOpen); - void Close(long arg); + void Close(MxLong arg); LONG Seek(LONG lOffset, int iOrigin); - unsigned long Read(HPSTR pch, LONG cch); + MxULong Read(HPSTR pch, LONG cch); void SetBuffer(LPSTR pchBuffer, LONG cchBuffer, LONG unk); unsigned short Descend(LPMMCKINFO pmmcki, const MMCKINFO *pmmckiParent, UINT fuDescend); diff --git a/LEGO1/mxmediapresenter.cpp b/LEGO1/mxmediapresenter.cpp index 9df33285..58c068ac 100644 --- a/LEGO1/mxmediapresenter.cpp +++ b/LEGO1/mxmediapresenter.cpp @@ -3,7 +3,7 @@ DECOMP_SIZE_ASSERT(MxMediaPresenter, 0x50); // OFFSET: LEGO1 0x100b5d10 STUB -long MxMediaPresenter::Tickle() +MxLong MxMediaPresenter::Tickle() { // TODO return 0; diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h index b3a1b38a..64de0614 100644 --- a/LEGO1/mxmediapresenter.h +++ b/LEGO1/mxmediapresenter.h @@ -14,7 +14,7 @@ class MxMediaPresenter : public MxPresenter Init(); } - virtual long Tickle() override; // vtable+0x8, override MxCore + virtual MxLong Tickle() override; // vtable+0x8, override MxCore // OFFSET: LEGO1 0x1000c5c0 inline virtual const char *ClassName() const override // vtable+0xc diff --git a/LEGO1/mxnotificationmanager.cpp b/LEGO1/mxnotificationmanager.cpp index 8ce1f98b..472c87b5 100644 --- a/LEGO1/mxnotificationmanager.cpp +++ b/LEGO1/mxnotificationmanager.cpp @@ -7,7 +7,7 @@ MxNotificationManager::~MxNotificationManager() } // OFFSET: LEGO1 0x100ac800 STUB -long MxNotificationManager::Tickle() +MxLong MxNotificationManager::Tickle() { // TODO diff --git a/LEGO1/mxnotificationmanager.h b/LEGO1/mxnotificationmanager.h index e350ba56..86cb4f00 100644 --- a/LEGO1/mxnotificationmanager.h +++ b/LEGO1/mxnotificationmanager.h @@ -9,7 +9,7 @@ class MxNotificationManager : public MxCore public: virtual ~MxNotificationManager(); // vtable+0x0 - virtual long Tickle(); // vtable+0x8 + virtual MxLong Tickle(); // vtable+0x8 // 0x10: MxCriticalSection }; diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index 76287b82..10e8eccb 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -123,7 +123,7 @@ void MxOmni::Destroy() } // OFFSET: LEGO1 0x100b07f0 -long MxOmni::Notify(MxParam &p) +MxLong MxOmni::Notify(MxParam &p) { // FIXME: Stub return 0; diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index dee03229..f3f1ee9a 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -32,7 +32,7 @@ class MxOmni : public MxCore MxOmni(); virtual ~MxOmni() override; - virtual long Notify(MxParam &p); // vtable+04 + virtual MxLong Notify(MxParam &p); // vtable+04 virtual void Init(); // vtable+14 virtual MxResult Create(MxOmniCreateParam &p); // vtable+18 virtual void Destroy(); // vtable+1c diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp index 5ef01c64..4629fdba 100644 --- a/LEGO1/mxpresenter.cpp +++ b/LEGO1/mxpresenter.cpp @@ -34,7 +34,7 @@ MxPresenter::~MxPresenter() } // OFFSET: LEGO1 0x100b5200 STUB -long MxPresenter::Tickle() +MxLong MxPresenter::Tickle() { // TODO @@ -42,7 +42,7 @@ long MxPresenter::Tickle() } // OFFSET: LEGO1 0x100b4d80 STUB -long MxPresenter::StartAction(MxStreamController *, MxDSAction *) +MxLong MxPresenter::StartAction(MxStreamController *, MxDSAction *) { // TODO diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index a6616bd8..e01100c1 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -31,7 +31,7 @@ class MxPresenter : public MxCore return !strcmp(name, MxPresenter::ClassName()) || MxCore::IsA(name); } - __declspec(dllexport) virtual long Tickle() override; // vtable+0x8 + __declspec(dllexport) virtual MxLong Tickle() override; // vtable+0x8 virtual void VTable0x14(); // vtable+0x14 virtual void VTable0x18(); // vtable+0x18 virtual void VTable0x1c(); // vtable+0x1c @@ -44,7 +44,7 @@ class MxPresenter : public MxCore public: virtual undefined4 VTable0x34(); // vtable+0x34 virtual void InitVirtual(); // vtable+0x38 - __declspec(dllexport) virtual long StartAction(MxStreamController *, MxDSAction *); // vtable+0x3c + __declspec(dllexport) virtual MxLong StartAction(MxStreamController *, MxDSAction *); // vtable+0x3c __declspec(dllexport) virtual void EndAction(); // vtable+0x40 virtual void VTable0x44(undefined4 param); // vtable+0x44 virtual unsigned char VTable0x48(unsigned char param); // vtable+0x48 diff --git a/LEGO1/mxscheduler.cpp b/LEGO1/mxscheduler.cpp index 94228303..08bcd04c 100644 --- a/LEGO1/mxscheduler.cpp +++ b/LEGO1/mxscheduler.cpp @@ -8,7 +8,7 @@ MxScheduler *MxScheduler::GetInstance() } // OFFSET: LEGO1 0x100bf500 -void MxScheduler::StartMultiTasking(unsigned long) +void MxScheduler::StartMultiTasking(MxULong) { // Intentionally empty } diff --git a/LEGO1/mxscheduler.h b/LEGO1/mxscheduler.h index 4f7ee387..fabb33dc 100644 --- a/LEGO1/mxscheduler.h +++ b/LEGO1/mxscheduler.h @@ -1,11 +1,13 @@ #ifndef MXSCHEDULER_H #define MXSCHEDULER_H +#include "mxtypes.h" + class MxScheduler { public: __declspec(dllexport) static MxScheduler *GetInstance(); - __declspec(dllexport) void StartMultiTasking(unsigned long); + __declspec(dllexport) void StartMultiTasking(MxULong); }; #endif // MXSCHEDULER_H diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index 57c9a5b8..3f377151 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -14,14 +14,14 @@ MxStreamController *MxStreamer::Open(const char *name, unsigned short p) } // OFFSET: LEGO1 0x100b9570 STUB -long MxStreamer::Close(const char *p) +MxLong MxStreamer::Close(const char *p) { // TODO return 0; } // OFFSET: LEGO1 0x100b9b60 STUB -long MxStreamer::Notify(MxParam &p) +MxLong MxStreamer::Notify(MxParam &p) { // TODO diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index de84ed01..36f1a30f 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -12,9 +12,9 @@ class MxStreamer : public MxCore virtual ~MxStreamer() override; __declspec(dllexport) MxStreamController *Open(const char *name, unsigned short p); - __declspec(dllexport) long Close(const char *p); + __declspec(dllexport) MxLong Close(const char *p); - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 virtual MxResult VTable0x14(); // vtable+0x14 }; diff --git a/LEGO1/mxticklemanager.h b/LEGO1/mxticklemanager.h index 7ef50622..60f2f14d 100644 --- a/LEGO1/mxticklemanager.h +++ b/LEGO1/mxticklemanager.h @@ -9,7 +9,7 @@ class MxTickleManager : public MxCore public: virtual ~MxTickleManager(); - virtual long Tickle(); + virtual MxLong Tickle(); virtual const char *ClassName() const; virtual MxBool IsA(const char *name) const; virtual void vtable14(); diff --git a/LEGO1/mxtimer.cpp b/LEGO1/mxtimer.cpp index 47afaa03..0d5752d6 100644 --- a/LEGO1/mxtimer.cpp +++ b/LEGO1/mxtimer.cpp @@ -3,10 +3,10 @@ #include // 0x10101414 -long MxTimer::s_LastTimeCalculated = 0; +MxLong MxTimer::s_LastTimeCalculated = 0; // 0x10101418 -long MxTimer::s_LastTimeTimerStarted = 0; +MxLong MxTimer::s_LastTimeTimerStarted = 0; // OFFSET: LEGO1 0x100ae060 MxTimer::MxTimer() @@ -27,15 +27,15 @@ void MxTimer::Start() // OFFSET: LEGO1 0x100ae180 void MxTimer::Stop() { - long elapsed = this->GetRealTime(); - long startTime = elapsed - MxTimer::s_LastTimeTimerStarted; + MxLong elapsed = this->GetRealTime(); + MxLong startTime = elapsed - MxTimer::s_LastTimeTimerStarted; this->m_isRunning = FALSE; // this feels very stupid but it's what the assembly does this->m_startTime = this->m_startTime + startTime - 5; } // OFFSET: LEGO1 0x100ae140 -long MxTimer::GetRealTime() +MxLong MxTimer::GetRealTime() { MxTimer::s_LastTimeCalculated = timeGetTime(); return MxTimer::s_LastTimeCalculated - this->m_startTime; diff --git a/LEGO1/mxtimer.h b/LEGO1/mxtimer.h index 564eedfa..1714e8e1 100644 --- a/LEGO1/mxtimer.h +++ b/LEGO1/mxtimer.h @@ -13,9 +13,9 @@ class MxTimer : public MxCore void Start(); void Stop(); - __declspec(dllexport) long GetRealTime(); + __declspec(dllexport) MxLong GetRealTime(); - inline long GetTime() + inline MxLong GetTime() { if (this->m_isRunning) return s_LastTimeCalculated; @@ -24,10 +24,10 @@ class MxTimer : public MxCore } private: - long m_startTime; + MxLong m_startTime; MxBool m_isRunning; - static long s_LastTimeCalculated; - static long s_LastTimeTimerStarted; + static MxLong s_LastTimeCalculated; + static MxLong s_LastTimeTimerStarted; }; #endif // MXTIMER_H diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index b9631629..8af3f497 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -13,7 +13,7 @@ MxTransitionManager::~MxTransitionManager() } // OFFSET: LEGO1 0x1004bac0 STUB -long MxTransitionManager::Tickle() +MxLong MxTransitionManager::Tickle() { // TODO diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index 9dcb7f7c..c6cc28aa 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -14,7 +14,7 @@ class MxTransitionManager : public MxCore __declspec(dllexport) void SetWaitIndicator(MxVideoPresenter *videoPresenter); - virtual long Tickle(); // vtable+0x8 + virtual MxLong Tickle(); // vtable+0x8 }; #endif // MXTRANSITIONMANAGER_H diff --git a/LEGO1/mxtypes.h b/LEGO1/mxtypes.h index 71421d91..bcc401b2 100644 --- a/LEGO1/mxtypes.h +++ b/LEGO1/mxtypes.h @@ -8,11 +8,24 @@ typedef short MxS16; typedef unsigned int MxU32; typedef int MxS32; -typedef unsigned long MxResult; -const MxResult SUCCESS = 0; -const MxResult FAILURE = 0xFFFFFFFFL; +// On MSVC, a long is 32-bit, but on GCC/Clang, it's 64-bit. LEGO Island obviously +// assumes the former in all cases, which could become an issue in the future. +// The "longs" can't all be changed to "ints" (which are 32-bit on both) because +// this will break DLL export compatibility. Therefore, we define MxLong/MxULong, +// which is guaranteed to be 32-bit, and guaranteed to be a "long" on MSVC. +#if defined(_MSC_VER) +typedef long MxLong; +typedef unsigned long MxULong; +#else +typedef int MxLong; +typedef unsigned int MxULong; +#endif -typedef unsigned char MxBool; +typedef MxLong MxResult; +const MxResult SUCCESS = 0; +const MxResult FAILURE = -1; + +typedef MxU8 MxBool; #ifndef TRUE #define TRUE 1 diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index 178bc883..543f4136 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -7,7 +7,7 @@ MxVideoManager::~MxVideoManager() } // OFFSET: LEGO1 0x100bea90 STUB -long MxVideoManager::Tickle() +MxLong MxVideoManager::Tickle() { // TODO @@ -39,7 +39,7 @@ void MxVideoManager::InvalidateRect(MxRect32 &p_rect) } // OFFSET: LEGO1 0x100bebe0 -long MxVideoManager::RealizePalette(MxPalette *p_palette) +MxLong MxVideoManager::RealizePalette(MxPalette *p_palette) { PALETTEENTRY paletteEntries[256]; diff --git a/LEGO1/mxvideomanager.h b/LEGO1/mxvideomanager.h index d8e0c7bd..f70bf06e 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -11,10 +11,10 @@ class MxVideoManager : public MxUnknown100dc6b0 public: virtual ~MxVideoManager(); - virtual long Tickle(); // vtable+0x8 + virtual MxLong Tickle(); // vtable+0x8 __declspec(dllexport) void InvalidateRect(MxRect32 &); - __declspec(dllexport) virtual long RealizePalette(MxPalette *); // vtable+0x30 + __declspec(dllexport) virtual MxLong RealizePalette(MxPalette *); // vtable+0x30 MxVideoManager(); diff --git a/LEGO1/mxvideoparam.cpp b/LEGO1/mxvideoparam.cpp index 81f5d2d7..6f74f7a9 100644 --- a/LEGO1/mxvideoparam.cpp +++ b/LEGO1/mxvideoparam.cpp @@ -17,7 +17,7 @@ MxVideoParam::MxVideoParam() } // OFFSET: LEGO1 0x100beca0 -MxVideoParam::MxVideoParam(COMPAT_CONST MxRect32 &p_rect, MxPalette *p_pal, unsigned long p_backBuffers, COMPAT_CONST MxVideoParamFlags &p_flags) +MxVideoParam::MxVideoParam(COMPAT_CONST MxRect32 &p_rect, MxPalette *p_pal, MxULong p_backBuffers, COMPAT_CONST MxVideoParamFlags &p_flags) { this->m_rect.m_left = p_rect.m_left; this->m_rect.m_top = p_rect.m_top; diff --git a/LEGO1/mxvideoparam.h b/LEGO1/mxvideoparam.h index 0b6b2a38..2376e5db 100644 --- a/LEGO1/mxvideoparam.h +++ b/LEGO1/mxvideoparam.h @@ -15,7 +15,7 @@ class MxVideoParam public: __declspec(dllexport) MxVideoParam(); __declspec(dllexport) MxVideoParam(MxVideoParam &); - __declspec(dllexport) MxVideoParam(COMPAT_CONST MxRect32 &rect, MxPalette *pal, unsigned long p3, COMPAT_CONST MxVideoParamFlags &flags); + __declspec(dllexport) MxVideoParam(COMPAT_CONST MxRect32 &rect, MxPalette *pal, MxULong p3, COMPAT_CONST MxVideoParamFlags &flags); __declspec(dllexport) MxVideoParam &operator=(const MxVideoParam &); __declspec(dllexport) ~MxVideoParam(); diff --git a/LEGO1/police.cpp b/LEGO1/police.cpp index bd268411..37f10295 100644 --- a/LEGO1/police.cpp +++ b/LEGO1/police.cpp @@ -13,7 +13,7 @@ Police::~Police() } // OFFSET: LEGO1 0x1005e480 STUB -long Police::Notify(MxParam &p) +MxLong Police::Notify(MxParam &p) { // TODO diff --git a/LEGO1/police.h b/LEGO1/police.h index c4bea1cf..8ff6dff9 100644 --- a/LEGO1/police.h +++ b/LEGO1/police.h @@ -12,7 +12,7 @@ class Police : public LegoWorld Police(); virtual ~Police() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 }; diff --git a/LEGO1/registrationbook.cpp b/LEGO1/registrationbook.cpp index 5668d31c..dc03a327 100644 --- a/LEGO1/registrationbook.cpp +++ b/LEGO1/registrationbook.cpp @@ -13,7 +13,7 @@ RegistrationBook::~RegistrationBook() } // OFFSET: LEGO1 0x100770e0 STUB -long RegistrationBook::Notify(MxParam &p) +MxLong RegistrationBook::Notify(MxParam &p) { // TODO diff --git a/LEGO1/registrationbook.h b/LEGO1/registrationbook.h index 4dba2173..a8219569 100644 --- a/LEGO1/registrationbook.h +++ b/LEGO1/registrationbook.h @@ -11,7 +11,7 @@ class RegistrationBook : public LegoWorld RegistrationBook(); virtual ~RegistrationBook() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 }; diff --git a/LEGO1/score.cpp b/LEGO1/score.cpp index 4e3c7801..fc4070f7 100644 --- a/LEGO1/score.cpp +++ b/LEGO1/score.cpp @@ -13,7 +13,7 @@ Score::~Score() } // OFFSET: LEGO1 0x10001410 STUB -long Score::Notify(MxParam &p) +MxLong Score::Notify(MxParam &p) { // TODO diff --git a/LEGO1/score.h b/LEGO1/score.h index d2a7a7f6..e103b4bc 100644 --- a/LEGO1/score.h +++ b/LEGO1/score.h @@ -11,7 +11,7 @@ class Score : public LegoWorld Score(); virtual ~Score() override; // vtable+0x0 - virtual long Notify(MxParam &p) override; // vtable+0x4 + virtual MxLong Notify(MxParam &p) override; // vtable+0x4 }; From 5d099115fee55f14fe8364adf4866d6fe2147caf Mon Sep 17 00:00:00 2001 From: MattKC <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 2 Jul 2023 01:11:49 -0700 Subject: [PATCH 31/34] Update CONTRIBUTING.md [skip ci] --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5633e7c6..c9d3364a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,6 +30,7 @@ In general, we're not exhaustively strict about coding style, but there are some - `m_camelCase` for member variables. - `g_camelCase` for global variables. - `p_camelCase` for function parameters. +- Instead of C++ primitives (e.g. `int`, `long`, etc.), use types in `mxtypes.h` instead. This will help us ensure that variables will be the correct size regardless of the underlying compiler/platform/architecture. ## Questions? From 8fa45bbe0f4d1242fdb71846cd11a72de2ca0430 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 2 Jul 2023 02:07:11 -0700 Subject: [PATCH 32/34] replace shorts with MxS16/MxU16/undefined2 --- LEGO1/legogamestate.cpp | 4 ++-- LEGO1/legogamestate.h | 4 ++-- LEGO1/legoomni.cpp | 2 +- LEGO1/legoomni.h | 2 +- LEGO1/mxdsfile.h | 8 ++++---- LEGO1/mxdsobject.cpp | 2 +- LEGO1/mxdsobject.h | 10 +++++----- LEGO1/mxioinfo.cpp | 6 +++--- LEGO1/mxioinfo.h | 4 ++-- LEGO1/mxstreamer.cpp | 2 +- LEGO1/mxstreamer.h | 2 +- LEGO1/mxstring.h | 2 +- LEGO1/mxvideopresenter.cpp | 3 ++- LEGO1/mxvideopresenter.h | 8 +++++--- 14 files changed, 31 insertions(+), 28 deletions(-) diff --git a/LEGO1/legogamestate.cpp b/LEGO1/legogamestate.cpp index 66873f12..c12a5e06 100644 --- a/LEGO1/legogamestate.cpp +++ b/LEGO1/legogamestate.cpp @@ -27,13 +27,13 @@ MxResult LegoGameState::Save(MxULong p) } // OFFSET: LEGO1 0x1003a2e0 -void LegoGameState::SerializePlayersInfo(short p) +void LegoGameState::SerializePlayersInfo(MxS16 p) { // TODO } // OFFSET: LEGO1 0x1003cdd0 -void LegoGameState::SerializeScoreHistory(short p) +void LegoGameState::SerializeScoreHistory(MxS16 p) { // TODO } diff --git a/LEGO1/legogamestate.h b/LEGO1/legogamestate.h index fdd5bcb1..80437051 100644 --- a/LEGO1/legogamestate.h +++ b/LEGO1/legogamestate.h @@ -10,8 +10,8 @@ class LegoGameState __declspec(dllexport) ~LegoGameState(); __declspec(dllexport) MxResult Load(MxULong); __declspec(dllexport) MxResult Save(MxULong p); - __declspec(dllexport) void SerializePlayersInfo(short p); - __declspec(dllexport) void SerializeScoreHistory(short p); + __declspec(dllexport) void SerializePlayersInfo(MxS16 p); + __declspec(dllexport) void SerializeScoreHistory(MxS16 p); __declspec(dllexport) void SetSavePath(char *p); }; diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 32fb4d7f..b5cbca8e 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -112,7 +112,7 @@ MxBackgroundAudioManager *BackgroundAudioManager() } // OFFSET: LEGO1 0x100c0280 STUB -MxDSObject *CreateStreamObject(MxDSFile *,short) +MxDSObject *CreateStreamObject(MxDSFile *,MxS16) { // TODO return NULL; diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 9c8df71f..0ba27cf2 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -95,7 +95,7 @@ class LegoOmni : public MxOmni }; __declspec(dllexport) MxBackgroundAudioManager * BackgroundAudioManager(); -__declspec(dllexport) MxDSObject * CreateStreamObject(MxDSFile *,short); +__declspec(dllexport) MxDSObject * CreateStreamObject(MxDSFile *,MxS16); __declspec(dllexport) LegoGameState * GameState(); __declspec(dllexport) const char * GetNoCD_SourceName(); __declspec(dllexport) LegoInputManager * InputManager(); diff --git a/LEGO1/mxdsfile.h b/LEGO1/mxdsfile.h index ae44ff46..ac812df7 100644 --- a/LEGO1/mxdsfile.h +++ b/LEGO1/mxdsfile.h @@ -41,11 +41,11 @@ class MxDSFile : public MxDSSource , streamBuffersNum(0) {} - unsigned short majorVersion; - unsigned short minorVersion; + MxU16 majorVersion; + MxU16 minorVersion; MxULong bufferSize; - short streamBuffersNum; - short reserved; + MxS16 streamBuffersNum; + MxS16 reserved; }; MxString m_filename; diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index 66b1ed6c..abe8902f 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -111,7 +111,7 @@ unsigned int MxDSObject::CalculateUnk08() } // OFFSET: LEGO1 0x100bfa20 -void MxDSObject::Parse(char **p_source, unsigned short p_unk24) +void MxDSObject::Parse(char **p_source, MxU16 p_unk24) { this->SetSourceName(*p_source); *p_source += strlen(this->m_sourceName) + 1; diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index ef4701bc..ff7d4a02 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -25,7 +25,7 @@ class MxDSObject : public MxCore virtual int unk14(); // vtable+14; virtual unsigned int CalculateUnk08(); // vtable+18; - virtual void Parse(char **p_source, unsigned short p_unk24); // vtable+1c; + virtual void Parse(char **p_source, MxU16 p_unk24); // vtable+1c; void SetSourceName(const char *p_sourceName); @@ -33,7 +33,7 @@ class MxDSObject : public MxCore inline int GetUnknown1c() { return this->m_unk1c; } inline void SetUnknown1c(int p_unk1c) { this->m_unk1c = p_unk1c; } - inline void SetUnknown24(short p_unk24) { this->m_unk24 = p_unk24; } + inline void SetUnknown24(MxS16 p_unk24) { this->m_unk24 = p_unk24; } // OFFSET: ISLE 0x401c40 // OFFSET: LEGO1 0x10005530 @@ -41,14 +41,14 @@ class MxDSObject : public MxCore private: unsigned int m_unk08; - short m_unk0c; + MxS16 m_unk0c; char* m_sourceName; int m_unk14; char *m_objectName; int m_unk1c; MxAtomId m_atomId; - short m_unk24; - unsigned short m_unk26; + MxS16 m_unk24; + MxU16 m_unk26; int m_unk28; }; diff --git a/LEGO1/mxioinfo.cpp b/LEGO1/mxioinfo.cpp index d95a00ef..2d55ef36 100644 --- a/LEGO1/mxioinfo.cpp +++ b/LEGO1/mxioinfo.cpp @@ -13,7 +13,7 @@ MXIOINFO::~MXIOINFO() } // OFFSET: LEGO1 0x100cc830 -unsigned short MXIOINFO::Open(const char *filename, DWORD fdwOpen) +MxU16 MXIOINFO::Open(const char *filename, DWORD fdwOpen) { return 0; } @@ -43,7 +43,7 @@ void MXIOINFO::SetBuffer(LPSTR pchBuffer, LONG cchBuffer, LONG unk) } // OFFSET: LEGO1 0x100cce60 -unsigned short MXIOINFO::Descend(LPMMCKINFO pmmcki, const MMCKINFO *pmmckiParent, UINT fuDescend) +MxU16 MXIOINFO::Descend(LPMMCKINFO pmmcki, const MMCKINFO *pmmckiParent, UINT fuDescend) { return 0; -} \ No newline at end of file +} diff --git a/LEGO1/mxioinfo.h b/LEGO1/mxioinfo.h index 9556e5df..5ce0947a 100644 --- a/LEGO1/mxioinfo.h +++ b/LEGO1/mxioinfo.h @@ -12,12 +12,12 @@ class MXIOINFO MXIOINFO(); __declspec(dllexport) ~MXIOINFO(); - unsigned short Open(const char *filename, DWORD fdwOpen); + MxU16 Open(const char *filename, DWORD fdwOpen); void Close(MxLong arg); LONG Seek(LONG lOffset, int iOrigin); MxULong Read(HPSTR pch, LONG cch); void SetBuffer(LPSTR pchBuffer, LONG cchBuffer, LONG unk); - unsigned short Descend(LPMMCKINFO pmmcki, const MMCKINFO *pmmckiParent, UINT fuDescend); + MxU16 Descend(LPMMCKINFO pmmcki, const MMCKINFO *pmmckiParent, UINT fuDescend); MMIOINFO m_info; }; diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index 3f377151..12f51f99 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -7,7 +7,7 @@ MxStreamer::~MxStreamer() } // OFFSET: LEGO1 0x100b92c0 STUB -MxStreamController *MxStreamer::Open(const char *name, unsigned short p) +MxStreamController *MxStreamer::Open(const char *name, MxU16 p) { // TODO return NULL; diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index 36f1a30f..f14ac66d 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -11,7 +11,7 @@ class MxStreamer : public MxCore public: virtual ~MxStreamer() override; - __declspec(dllexport) MxStreamController *Open(const char *name, unsigned short p); + __declspec(dllexport) MxStreamController *Open(const char *name, MxU16 p); __declspec(dllexport) MxLong Close(const char *p); virtual MxLong Notify(MxParam &p) override; // vtable+0x4 diff --git a/LEGO1/mxstring.h b/LEGO1/mxstring.h index a6552bb5..a24a0df1 100644 --- a/LEGO1/mxstring.h +++ b/LEGO1/mxstring.h @@ -23,7 +23,7 @@ class MxString : public MxCore private: char *m_data; - unsigned short m_length; + MxU16 m_length; }; diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp index ee12968a..4e47e4a4 100644 --- a/LEGO1/mxvideopresenter.cpp +++ b/LEGO1/mxvideopresenter.cpp @@ -3,6 +3,7 @@ DECOMP_SIZE_ASSERT(MxVideoPresenter, 0x64); // OFFSET: LEGO1 0x100b2760 STUB -void MxVideoPresenter::Init() { +void MxVideoPresenter::Init() +{ // TODO } diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h index e9634427..19c211c3 100644 --- a/LEGO1/mxvideopresenter.h +++ b/LEGO1/mxvideopresenter.h @@ -8,9 +8,11 @@ class MxVideoPresenter : public MxMediaPresenter { public: - MxVideoPresenter() { + MxVideoPresenter() + { Init(); } + // OFFSET: LEGO1 0x1000c820 inline virtual const char *ClassName() const override // vtable+0x0c { @@ -29,9 +31,9 @@ class MxVideoPresenter : public MxMediaPresenter undefined4 m_unk50; undefined4 m_unk54; undefined4 m_unk58; - short m_unk5c; + undefined2 m_unk5c; unsigned char m_flags; - int m_unk60; + undefined4 m_unk60; }; #endif // MXVIDEOPRESENTER_H From 9415bd18bbd65c9c15605eceb279069dd7a8c39c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 2 Jul 2023 10:07:55 -0700 Subject: [PATCH 33/34] fill out the rest of our primitives in mxtypes --- LEGO1/mxtypes.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/LEGO1/mxtypes.h b/LEGO1/mxtypes.h index bcc401b2..8a7d5026 100644 --- a/LEGO1/mxtypes.h +++ b/LEGO1/mxtypes.h @@ -2,11 +2,15 @@ #define MXTYPE_H typedef unsigned char MxU8; -typedef char MxS8; +typedef signed char MxS8; typedef unsigned short MxU16; -typedef short MxS16; +typedef signed short MxS16; typedef unsigned int MxU32; -typedef int MxS32; +typedef signed int MxS32; +typedef unsigned __int64 MxU64; +typedef signed __int64 MxS64; +typedef float MxFloat; +typedef double MxDouble; // On MSVC, a long is 32-bit, but on GCC/Clang, it's 64-bit. LEGO Island obviously // assumes the former in all cases, which could become an issue in the future. From d64a04705c9ae8fd4fdb750ff065caca49aeaab5 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 2 Jul 2023 19:17:15 +0200 Subject: [PATCH 34/34] lego: fix/match SetColorString (#72) * lego: fix/match SetColorString * explicitly cast to float to avoid warning * style fixes * remove superfluous includes * Update legobackgroundcolor.cpp --- LEGO1/legobackgroundcolor.cpp | 69 +++++++++++++++++------------------ LEGO1/legobackgroundcolor.h | 10 ++--- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/LEGO1/legobackgroundcolor.cpp b/LEGO1/legobackgroundcolor.cpp index b818267f..2d8c5348 100644 --- a/LEGO1/legobackgroundcolor.cpp +++ b/LEGO1/legobackgroundcolor.cpp @@ -4,53 +4,50 @@ #include "legoutil.h" #include "legovideomanager.h" -const char *Delimiter = "\t"; -const char *set = "set"; -const char *reset = "reset"; +const char *g_delimiter = "\t"; +const char *g_set = "set"; +const char *g_reset = "reset"; // OFFSET: LEGO1 0x1003bfb0 -LegoBackgroundColor::LegoBackgroundColor(const char *name, const char *colorString) +LegoBackgroundColor::LegoBackgroundColor(const char *p_name, const char *p_colorString) { - m_name = name; + m_name = p_name; m_name.ToUpperCase(); - SetColorString(colorString); + SetColorString(p_colorString); } // OFFSET: LEGO1 0x1003c070 -void LegoBackgroundColor::SetColorString(const char *colorString) +void LegoBackgroundColor::SetColorString(const char *p_colorString) { - m_name = colorString; + m_string = p_colorString; m_string.ToLowerCase(); - float converted_r; - float converted_b; - float converted_g; LegoVideoManager *videomanager = VideoManager(); + if (!videomanager || !p_colorString) + return; - if (videomanager && colorString) - { - int length = strlen(colorString) + 1; - char *colorStringCopy = new char[length]; - strcpy(colorStringCopy, colorString); - char *colorStringSplit = strtok(colorStringCopy, Delimiter); - if (!strcmp(colorStringSplit, set)) - { - char *hue = strtok(0, Delimiter); - if (hue) - h = atoi(hue) * 0.01; - char *sat = strtok(0, Delimiter); - if (sat) - s = atoi(sat) * 0.01; - char *val = strtok(0, Delimiter); - if (val) - v = atoi(val) * 0.01; - } - else if (!strcmp(colorStringSplit, reset)) - { - // reset it - ConvertHSVToRGB(this->h, this->s, this->v, &converted_r, &converted_g, &converted_b); - videomanager->SetSkyColor(converted_r, converted_g, converted_b); - } - delete[] colorStringCopy; + float converted_r, converted_g, converted_b; + char *colorStringCopy = strcpy(new char[strlen(p_colorString) + 1], p_colorString); + char *colorStringSplit = strtok(colorStringCopy, g_delimiter); + + if (!strcmp(colorStringSplit, g_set)) { + colorStringSplit = strtok(0, g_delimiter); + if (colorStringSplit) + h = (float) (atoi(colorStringSplit) * 0.01); + colorStringSplit = strtok(0, g_delimiter); + if (colorStringSplit) + s = (float) (atoi(colorStringSplit) * 0.01); + colorStringSplit = strtok(0, g_delimiter); + if (colorStringSplit) + v = (float) (atoi(colorStringSplit) * 0.01); + + ConvertHSVToRGB(this->h, this->s, this->v, &converted_r, &converted_g, &converted_b); + videomanager->SetSkyColor(converted_r, converted_g, converted_b); } + else if (!strcmp(colorStringSplit, g_reset)) { + ConvertHSVToRGB(this->h, this->s, this->v, &converted_r, &converted_g, &converted_b); + videomanager->SetSkyColor(converted_r, converted_g, converted_b); + } + + delete[] colorStringCopy; } diff --git a/LEGO1/legobackgroundcolor.h b/LEGO1/legobackgroundcolor.h index 1daa6311..9345c394 100644 --- a/LEGO1/legobackgroundcolor.h +++ b/LEGO1/legobackgroundcolor.h @@ -1,15 +1,15 @@ #ifndef LEGOBACKGROUNDCOLOR_H #define LEGOBACKGROUNDCOLOR_H -#include "mxstring.h" -#include "mxcore.h" + #include "mxstringvariable.h" class LegoBackgroundColor : public MxStringVariable { public: - __declspec(dllexport) LegoBackgroundColor(const char *, const char *); - void SetColorString(const char *colorString); -protected: + __declspec(dllexport) LegoBackgroundColor(const char *p_name, const char *p_colorString); + void SetColorString(const char *p_colorString); + +private: float h; float s; float v;