Merge branch 'master' into beta10macro

This commit is contained in:
Christian Semmler 2025-01-06 15:48:02 -07:00
commit fd656ed900
137 changed files with 4830 additions and 4372 deletions

View File

@ -94,15 +94,15 @@ function(add_lego_libraries NAME)
set(SUFFIX "${ARG_SUFFIX}") set(SUFFIX "${ARG_SUFFIX}")
add_library(tglrl${ARG_SUFFIX} STATIC add_library(tglrl${ARG_SUFFIX} STATIC
LEGO1/tgl/d3drm/camera.cpp
LEGO1/tgl/d3drm/device.cpp
LEGO1/tgl/d3drm/group.cpp
LEGO1/tgl/d3drm/light.cpp
LEGO1/tgl/d3drm/mesh.cpp
LEGO1/tgl/d3drm/meshbuilder.cpp
LEGO1/tgl/d3drm/renderer.cpp LEGO1/tgl/d3drm/renderer.cpp
LEGO1/tgl/d3drm/texture.cpp LEGO1/tgl/d3drm/texture.cpp
LEGO1/tgl/d3drm/view.cpp LEGO1/tgl/d3drm/view.cpp
LEGO1/tgl/d3drm/device.cpp
LEGO1/tgl/d3drm/group.cpp
LEGO1/tgl/d3drm/camera.cpp
LEGO1/tgl/d3drm/light.cpp
LEGO1/tgl/d3drm/meshbuilder.cpp
LEGO1/tgl/d3drm/mesh.cpp
) )
list(APPEND list_targets tglrl${ARG_SUFFIX}) list(APPEND list_targets tglrl${ARG_SUFFIX})
set_property(TARGET tglrl${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "tglrl40$<$<CONFIG:Debug>:d>${ARG_SUFFIX}") set_property(TARGET tglrl${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "tglrl40$<$<CONFIG:Debug>:d>${ARG_SUFFIX}")
@ -110,11 +110,9 @@ function(add_lego_libraries NAME)
target_link_libraries(tglrl${ARG_SUFFIX} PRIVATE d3drm) target_link_libraries(tglrl${ARG_SUFFIX} PRIVATE d3drm)
add_library(realtime${ARG_SUFFIX} STATIC add_library(realtime${ARG_SUFFIX} STATIC
LEGO1/realtime/matrix.cpp
LEGO1/realtime/orientableroi.cpp LEGO1/realtime/orientableroi.cpp
LEGO1/realtime/realtime.cpp LEGO1/realtime/realtime.cpp
LEGO1/realtime/realtimeview.cpp LEGO1/realtime/realtimeview.cpp
LEGO1/realtime/vector.cpp
) )
list(APPEND list_targets realtime${ARG_SUFFIX}) list(APPEND list_targets realtime${ARG_SUFFIX})
set_property(TARGET realtime${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "realtime$<$<CONFIG:Debug>:d>${ARG_SUFFIX}") set_property(TARGET realtime${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "realtime$<$<CONFIG:Debug>:d>${ARG_SUFFIX}")
@ -123,8 +121,8 @@ function(add_lego_libraries NAME)
add_library(viewmanager${ARG_SUFFIX} STATIC add_library(viewmanager${ARG_SUFFIX} STATIC
LEGO1/viewmanager/viewlod.cpp LEGO1/viewmanager/viewlod.cpp
LEGO1/viewmanager/viewlodlist.cpp
LEGO1/viewmanager/viewmanager.cpp LEGO1/viewmanager/viewmanager.cpp
LEGO1/viewmanager/viewlodlist.cpp
LEGO1/viewmanager/viewroi.cpp LEGO1/viewmanager/viewroi.cpp
) )
list(APPEND list_targets viewmanager${ARG_SUFFIX}) list(APPEND list_targets viewmanager${ARG_SUFFIX})
@ -134,9 +132,9 @@ function(add_lego_libraries NAME)
add_library(mxdirectx${ARG_SUFFIX} STATIC add_library(mxdirectx${ARG_SUFFIX} STATIC
LEGO1/mxdirectx/mxdirect3d.cpp LEGO1/mxdirectx/mxdirect3d.cpp
LEGO1/mxdirectx/mxdirectdraw.cpp
LEGO1/mxdirectx/mxdirectxinfo.cpp LEGO1/mxdirectx/mxdirectxinfo.cpp
LEGO1/mxdirectx/legodxinfo.cpp LEGO1/mxdirectx/legodxinfo.cpp
LEGO1/mxdirectx/mxdirectdraw.cpp
) )
list(APPEND list_targets mxdirectx${ARG_SUFFIX}) list(APPEND list_targets mxdirectx${ARG_SUFFIX})
set_property(TARGET mxdirectx${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "MxDirectX$<$<CONFIG:Debug>:d>${ARG_SUFFIX}") set_property(TARGET mxdirectx${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "MxDirectX$<$<CONFIG:Debug>:d>${ARG_SUFFIX}")
@ -144,8 +142,8 @@ function(add_lego_libraries NAME)
target_link_libraries(mxdirectx${ARG_SUFFIX} PRIVATE ddraw) target_link_libraries(mxdirectx${ARG_SUFFIX} PRIVATE ddraw)
add_library(roi${ARG_SUFFIX} STATIC add_library(roi${ARG_SUFFIX} STATIC
LEGO1/lego/sources/roi/legolod.cpp
LEGO1/lego/sources/roi/legoroi.cpp LEGO1/lego/sources/roi/legoroi.cpp
LEGO1/lego/sources/roi/legolod.cpp
) )
list(APPEND list_targets roi${ARG_SUFFIX}) list(APPEND list_targets roi${ARG_SUFFIX})
set_property(TARGET roi${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "roi$<$<CONFIG:Debug>:d>${ARG_SUFFIX}") set_property(TARGET roi${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "roi$<$<CONFIG:Debug>:d>${ARG_SUFFIX}")
@ -154,8 +152,8 @@ function(add_lego_libraries NAME)
add_library(geom${ARG_SUFFIX} STATIC add_library(geom${ARG_SUFFIX} STATIC
LEGO1/lego/sources/geom/legoedge.cpp LEGO1/lego/sources/geom/legoedge.cpp
LEGO1/lego/sources/geom/legounkown100db7f4.cpp
LEGO1/lego/sources/geom/legoweedge.cpp LEGO1/lego/sources/geom/legoweedge.cpp
LEGO1/lego/sources/geom/legounkown100db7f4.cpp
LEGO1/lego/sources/geom/legowegedge.cpp LEGO1/lego/sources/geom/legowegedge.cpp
) )
list(APPEND list_targets geom${ARG_SUFFIX}) list(APPEND list_targets geom${ARG_SUFFIX})
@ -164,11 +162,11 @@ function(add_lego_libraries NAME)
target_link_libraries(geom${ARG_SUFFIX} PRIVATE) target_link_libraries(geom${ARG_SUFFIX} PRIVATE)
add_library(shape${ARG_SUFFIX} STATIC add_library(shape${ARG_SUFFIX} STATIC
LEGO1/lego/sources/shape/legocolor.cpp
LEGO1/lego/sources/shape/legobox.cpp LEGO1/lego/sources/shape/legobox.cpp
LEGO1/lego/sources/shape/legomesh.cpp
LEGO1/lego/sources/shape/legosphere.cpp LEGO1/lego/sources/shape/legosphere.cpp
LEGO1/lego/sources/shape/legovertex.cpp LEGO1/lego/sources/shape/legovertex.cpp
LEGO1/lego/sources/shape/legomesh.cpp
LEGO1/lego/sources/shape/legocolor.cpp
) )
list(APPEND list_targets shape${ARG_SUFFIX}) list(APPEND list_targets shape${ARG_SUFFIX})
set_property(TARGET shape${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "shape$<$<CONFIG:Debug>:d>${ARG_SUFFIX}") set_property(TARGET shape${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "shape$<$<CONFIG:Debug>:d>${ARG_SUFFIX}")
@ -183,10 +181,10 @@ function(add_lego_libraries NAME)
target_include_directories(anim${ARG_SUFFIX} PRIVATE "${PROJECT_SOURCE_DIR}/LEGO1/omni/include" "${PROJECT_SOURCE_DIR}/LEGO1" "${PROJECT_SOURCE_DIR}/LEGO1/lego/sources" "${PROJECT_SOURCE_DIR}/util") target_include_directories(anim${ARG_SUFFIX} PRIVATE "${PROJECT_SOURCE_DIR}/LEGO1/omni/include" "${PROJECT_SOURCE_DIR}/LEGO1" "${PROJECT_SOURCE_DIR}/LEGO1/lego/sources" "${PROJECT_SOURCE_DIR}/util")
add_library(misc${ARG_SUFFIX} STATIC add_library(misc${ARG_SUFFIX} STATIC
LEGO1/lego/sources/misc/legocontainer.cpp
LEGO1/lego/sources/misc/legoimage.cpp
LEGO1/lego/sources/misc/legostorage.cpp
LEGO1/lego/sources/misc/legotexture.cpp LEGO1/lego/sources/misc/legotexture.cpp
LEGO1/lego/sources/misc/legostorage.cpp
LEGO1/lego/sources/misc/legoimage.cpp
LEGO1/lego/sources/misc/legocontainer.cpp
LEGO1/lego/sources/misc/legotree.cpp LEGO1/lego/sources/misc/legotree.cpp
LEGO1/lego/sources/misc/legounknown.cpp LEGO1/lego/sources/misc/legounknown.cpp
) )
@ -196,8 +194,8 @@ function(add_lego_libraries NAME)
target_link_libraries(misc${ARG_SUFFIX} PRIVATE) target_link_libraries(misc${ARG_SUFFIX} PRIVATE)
add_library(3dmanager${ARG_SUFFIX} STATIC add_library(3dmanager${ARG_SUFFIX} STATIC
LEGO1/lego/sources/3dmanager/lego3dmanager.cpp
LEGO1/lego/sources/3dmanager/lego3dview.cpp LEGO1/lego/sources/3dmanager/lego3dview.cpp
LEGO1/lego/sources/3dmanager/lego3dmanager.cpp
LEGO1/lego/sources/3dmanager/legoview1.cpp LEGO1/lego/sources/3dmanager/legoview1.cpp
LEGO1/lego/sources/3dmanager/tglsurface.cpp LEGO1/lego/sources/3dmanager/tglsurface.cpp
) )
@ -207,86 +205,82 @@ function(add_lego_libraries NAME)
target_link_libraries(3dmanager${ARG_SUFFIX} PRIVATE Vec::Vec) target_link_libraries(3dmanager${ARG_SUFFIX} PRIVATE Vec::Vec)
add_library(omni${ARG_SUFFIX} STATIC add_library(omni${ARG_SUFFIX} STATIC
LEGO1/omni/src/action/mxdsaction.cpp LEGO1/omni/src/notify/mxnotificationmanager.cpp
LEGO1/omni/src/action/mxdsanim.cpp
LEGO1/omni/src/action/mxdsevent.cpp
LEGO1/omni/src/action/mxdsmediaaction.cpp
LEGO1/omni/src/action/mxdsmultiaction.cpp
LEGO1/omni/src/action/mxdsobjectaction.cpp
LEGO1/omni/src/action/mxdsobject.cpp
LEGO1/omni/src/action/mxdsparallelaction.cpp
LEGO1/omni/src/action/mxdsselectaction.cpp
LEGO1/omni/src/action/mxdsserialaction.cpp
LEGO1/omni/src/action/mxdssound.cpp
LEGO1/omni/src/action/mxdsstill.cpp
LEGO1/omni/src/action/mxdsstreamingaction.cpp
LEGO1/omni/src/audio/mxaudiomanager.cpp
LEGO1/omni/src/audio/mxaudiopresenter.cpp
LEGO1/omni/src/audio/mxloopingmidipresenter.cpp
LEGO1/omni/src/audio/mxmidipresenter.cpp
LEGO1/omni/src/audio/mxmusicmanager.cpp
LEGO1/omni/src/audio/mxmusicpresenter.cpp
LEGO1/omni/src/audio/mxsoundmanager.cpp
LEGO1/omni/src/audio/mxsoundpresenter.cpp
LEGO1/omni/src/audio/mxwavepresenter.cpp
LEGO1/omni/src/common/mxatom.cpp
LEGO1/omni/src/common/mxcompositepresenter.cpp
LEGO1/omni/src/common/mxcore.cpp
LEGO1/omni/src/common/mxdebug.cpp LEGO1/omni/src/common/mxdebug.cpp
LEGO1/omni/src/common/mxmediamanager.cpp
LEGO1/omni/src/common/mxmediapresenter.cpp
LEGO1/omni/src/common/mxmisc.cpp LEGO1/omni/src/common/mxmisc.cpp
LEGO1/omni/src/common/mxobjectfactory.cpp LEGO1/omni/src/common/mxatom.cpp
LEGO1/omni/src/common/mxpresenter.cpp LEGO1/omni/src/action/mxdsaction.cpp
LEGO1/omni/src/common/mxstring.cpp
LEGO1/omni/src/common/mxticklemanager.cpp
LEGO1/omni/src/common/mxtimer.cpp LEGO1/omni/src/common/mxtimer.cpp
LEGO1/omni/src/common/mxutilities.cpp LEGO1/omni/src/common/mxcore.cpp
LEGO1/omni/src/common/mxvariable.cpp LEGO1/omni/src/common/mxstring.cpp
LEGO1/omni/src/common/mxvariabletable.cpp LEGO1/omni/src/audio/mxsoundmanager.cpp
LEGO1/omni/src/entity/mxentity.cpp
LEGO1/omni/src/event/mxeventmanager.cpp
LEGO1/omni/src/event/mxeventpresenter.cpp
LEGO1/omni/src/main/mxomni.cpp LEGO1/omni/src/main/mxomni.cpp
LEGO1/omni/src/notify/mxactionnotificationparam.cpp
LEGO1/omni/src/main/mxomnicreateflags.cpp LEGO1/omni/src/main/mxomnicreateflags.cpp
LEGO1/omni/src/main/mxomnicreateparam.cpp LEGO1/omni/src/main/mxomnicreateparam.cpp
LEGO1/omni/src/notify/mxactionnotificationparam.cpp LEGO1/omni/src/common/mxobjectfactory.cpp
LEGO1/omni/src/notify/mxnotificationmanager.cpp LEGO1/omni/src/audio/mxsoundpresenter.cpp
LEGO1/omni/src/notify/mxnotificationparam.cpp LEGO1/omni/src/audio/mxwavepresenter.cpp
LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp LEGO1/omni/src/video/mxvideopresenter.cpp
LEGO1/omni/src/stream/mxdiskstreamprovider.cpp
LEGO1/omni/src/stream/mxdsbuffer.cpp
LEGO1/omni/src/stream/mxdschunk.cpp
LEGO1/omni/src/stream/mxdsfile.cpp
LEGO1/omni/src/stream/mxdssubscriber.cpp
LEGO1/omni/src/stream/mxio.cpp
LEGO1/omni/src/stream/mxramstreamcontroller.cpp
LEGO1/omni/src/stream/mxramstreamprovider.cpp
LEGO1/omni/src/stream/mxstreamchunk.cpp
LEGO1/omni/src/stream/mxstreamcontroller.cpp
LEGO1/omni/src/stream/mxstreamer.cpp
LEGO1/omni/src/system/mxautolock.cpp
LEGO1/omni/src/system/mxcriticalsection.cpp
LEGO1/omni/src/system/mxscheduler.cpp
LEGO1/omni/src/system/mxsemaphore.cpp
LEGO1/omni/src/system/mxthread.cpp
LEGO1/omni/src/system/mxticklethread.cpp
LEGO1/omni/src/video/flic.cpp
LEGO1/omni/src/video/mxbitmap.cpp
LEGO1/omni/src/video/mxdisplaysurface.cpp
LEGO1/omni/src/video/mxflcpresenter.cpp LEGO1/omni/src/video/mxflcpresenter.cpp
LEGO1/omni/src/video/mxsmkpresenter.cpp
LEGO1/omni/src/video/mxloopingflcpresenter.cpp LEGO1/omni/src/video/mxloopingflcpresenter.cpp
LEGO1/omni/src/video/mxloopingsmkpresenter.cpp LEGO1/omni/src/video/mxloopingsmkpresenter.cpp
LEGO1/omni/src/video/mxpalette.cpp LEGO1/omni/src/common/mxpresenter.cpp
LEGO1/omni/src/video/mxregion.cpp LEGO1/omni/src/common/mxmediapresenter.cpp
LEGO1/omni/src/video/mxregioncursor.cpp LEGO1/omni/src/common/mxcompositepresenter.cpp
LEGO1/omni/src/video/mxsmack.cpp LEGO1/omni/src/system/mxcriticalsection.cpp
LEGO1/omni/src/video/mxsmkpresenter.cpp LEGO1/omni/src/common/mxutilities.cpp
LEGO1/omni/src/common/mxvariabletable.cpp
LEGO1/omni/src/stream/mxdssubscriber.cpp
LEGO1/omni/src/common/mxmediamanager.cpp
LEGO1/omni/src/system/mxticklethread.cpp
LEGO1/omni/src/audio/mxaudiomanager.cpp
LEGO1/omni/src/system/mxautolock.cpp
LEGO1/omni/src/stream/mxstreamer.cpp
LEGO1/omni/src/video/mxstillpresenter.cpp LEGO1/omni/src/video/mxstillpresenter.cpp
LEGO1/omni/src/video/mxdisplaysurface.cpp
LEGO1/omni/src/video/mxbitmap.cpp
LEGO1/omni/src/video/flic.cpp
LEGO1/omni/src/common/mxticklemanager.cpp
LEGO1/omni/src/stream/mxdschunk.cpp
LEGO1/omni/src/video/mxvideomanager.cpp LEGO1/omni/src/video/mxvideomanager.cpp
LEGO1/omni/src/video/mxvideoparam.cpp
LEGO1/omni/src/video/mxvideoparamflags.cpp LEGO1/omni/src/video/mxvideoparamflags.cpp
LEGO1/omni/src/video/mxvideopresenter.cpp LEGO1/omni/src/video/mxvideoparam.cpp
LEGO1/omni/src/video/mxpalette.cpp
LEGO1/omni/src/system/mxscheduler.cpp
LEGO1/omni/src/system/mxthread.cpp
LEGO1/omni/src/action/mxdsobject.cpp
LEGO1/omni/src/event/mxeventmanager.cpp
LEGO1/omni/src/audio/mxmusicmanager.cpp
LEGO1/omni/src/stream/mxstreamcontroller.cpp
LEGO1/omni/src/audio/mxmusicpresenter.cpp
LEGO1/omni/src/audio/mxmidipresenter.cpp
LEGO1/omni/src/audio/mxloopingmidipresenter.cpp
LEGO1/omni/src/event/mxeventpresenter.cpp
LEGO1/omni/src/stream/mxstreamchunk.cpp
LEGO1/omni/src/video/mxregioncursor.cpp
LEGO1/omni/src/video/mxregion.cpp
LEGO1/omni/src/video/mxsmk.cpp
LEGO1/omni/src/stream/mxramstreamcontroller.cpp
LEGO1/omni/src/stream/mxdsbuffer.cpp
LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp
LEGO1/omni/src/system/mxsemaphore.cpp
LEGO1/omni/src/action/mxdsobjectaction.cpp
LEGO1/omni/src/action/mxdsmediaaction.cpp
LEGO1/omni/src/action/mxdsanim.cpp
LEGO1/omni/src/action/mxdssound.cpp
LEGO1/omni/src/action/mxdsevent.cpp
LEGO1/omni/src/action/mxdsstill.cpp
LEGO1/omni/src/action/mxdsmultiaction.cpp
LEGO1/omni/src/action/mxdsserialaction.cpp
LEGO1/omni/src/action/mxdsparallelaction.cpp
LEGO1/omni/src/action/mxdsselectaction.cpp
LEGO1/omni/src/stream/mxdsfile.cpp
LEGO1/omni/src/stream/mxio.cpp
LEGO1/omni/src/action/mxdsstreamingaction.cpp
LEGO1/omni/src/stream/mxramstreamprovider.cpp
LEGO1/omni/src/stream/mxdiskstreamprovider.cpp
) )
list(APPEND list_targets omni${ARG_SUFFIX}) list(APPEND list_targets omni${ARG_SUFFIX})
set_property(TARGET omni${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "omni$<$<CONFIG:Debug>:d>${ARG_SUFFIX}") set_property(TARGET omni${ARG_SUFFIX} PROPERTY ARCHIVE_OUTPUT_NAME "omni$<$<CONFIG:Debug>:d>${ARG_SUFFIX}")
@ -294,120 +288,121 @@ function(add_lego_libraries NAME)
target_link_libraries(omni${ARG_SUFFIX} PRIVATE dsound winmm Smacker::Smacker) target_link_libraries(omni${ARG_SUFFIX} PRIVATE dsound winmm Smacker::Smacker)
add_library(${NAME} SHARED add_library(${NAME} SHARED
LEGO1/define.cpp LEGO1/lego/legoomni/src/worlds/score.cpp
LEGO1/lego/legoomni/src/actors/act2actor.cpp LEGO1/lego/legoomni/src/actors/helicopter.cpp
LEGO1/lego/legoomni/src/actors/act2genactor.cpp LEGO1/lego/legoomni/src/worlds/gasstation.cpp
LEGO1/lego/legoomni/src/actors/act3actors.cpp LEGO1/lego/legoomni/src/audio/legocachsound.cpp
LEGO1/lego/legoomni/src/actors/act3ammo.cpp LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
LEGO1/lego/legoomni/src/actors/ambulance.cpp LEGO1/lego/legoomni/src/actors/skateboard.cpp
LEGO1/lego/legoomni/src/actors/bike.cpp LEGO1/lego/legoomni/src/entity/legoentity.cpp
LEGO1/lego/legoomni/src/audio/lego3dsound.cpp
LEGO1/lego/legoomni/src/entity/legocameracontroller.cpp
LEGO1/lego/legoomni/src/race/legoracers.cpp
LEGO1/lego/legoomni/src/race/legoraceactor.cpp
LEGO1/lego/legoomni/src/common/legostate.cpp
LEGO1/lego/legoomni/src/actors/buildingentity.cpp LEGO1/lego/legoomni/src/actors/buildingentity.cpp
LEGO1/lego/legoomni/src/actors/buildings.cpp LEGO1/lego/legoomni/src/actors/buildings.cpp
LEGO1/lego/legoomni/src/actors/bumpbouy.cpp
LEGO1/lego/legoomni/src/actors/doors.cpp
LEGO1/lego/legoomni/src/actors/dunebuggy.cpp
LEGO1/lego/legoomni/src/actors/helicopter.cpp
LEGO1/lego/legoomni/src/actors/isleactor.cpp
LEGO1/lego/legoomni/src/actors/islepathactor.cpp
LEGO1/lego/legoomni/src/actors/jetski.cpp
LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp
LEGO1/lego/legoomni/src/actors/motorcycle.cpp
LEGO1/lego/legoomni/src/actors/pizza.cpp
LEGO1/lego/legoomni/src/actors/pizzeria.cpp
LEGO1/lego/legoomni/src/actors/racecar.cpp
LEGO1/lego/legoomni/src/actors/radio.cpp
LEGO1/lego/legoomni/src/actors/skateboard.cpp
LEGO1/lego/legoomni/src/actors/towtrack.cpp
LEGO1/lego/legoomni/src/audio/lego3dsound.cpp
LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp
LEGO1/lego/legoomni/src/audio/legocachsound.cpp
LEGO1/lego/legoomni/src/audio/legocachesoundmanager.cpp
LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp
LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp
LEGO1/lego/legoomni/src/audio/mxbackgroundaudiomanager.cpp
LEGO1/lego/legoomni/src/build/legocarbuild.cpp
LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp
LEGO1/lego/legoomni/src/common/legoactioncontrolpresenter.cpp
LEGO1/lego/legoomni/src/common/legoactors.cpp
LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp
LEGO1/lego/legoomni/src/common/legobackgroundcolor.cpp
LEGO1/lego/legoomni/src/common/legobuildingmanager.cpp
LEGO1/lego/legoomni/src/common/legocharactermanager.cpp
LEGO1/lego/legoomni/src/common/legofullscreenmovie.cpp
LEGO1/lego/legoomni/src/common/legogamestate.cpp
LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
LEGO1/lego/legoomni/src/common/legophoneme.cpp
LEGO1/lego/legoomni/src/common/legoplantmanager.cpp
LEGO1/lego/legoomni/src/common/legoplants.cpp
LEGO1/lego/legoomni/src/common/legostate.cpp
LEGO1/lego/legoomni/src/common/legotextureinfo.cpp
LEGO1/lego/legoomni/src/common/legoutils.cpp
LEGO1/lego/legoomni/src/common/legovariables.cpp
LEGO1/lego/legoomni/src/common/misc.cpp LEGO1/lego/legoomni/src/common/misc.cpp
LEGO1/lego/legoomni/src/common/mxcompositemediapresenter.cpp
LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp
LEGO1/lego/legoomni/src/common/mxtransitionmanager.cpp
LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp
LEGO1/lego/legoomni/src/control/legometerpresenter.cpp
LEGO1/lego/legoomni/src/entity/act2brick.cpp
LEGO1/lego/legoomni/src/entity/act2policestation.cpp
LEGO1/lego/legoomni/src/entity/legoactor.cpp
LEGO1/lego/legoomni/src/entity/legoactorpresenter.cpp
LEGO1/lego/legoomni/src/entity/legocameracontroller.cpp
LEGO1/lego/legoomni/src/entity/legoentity.cpp
LEGO1/lego/legoomni/src/entity/legoentitypresenter.cpp
LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp
LEGO1/lego/legoomni/src/entity/legolocations.cpp
LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp
LEGO1/lego/legoomni/src/entity/legopovcontroller.cpp
LEGO1/lego/legoomni/src/entity/legoworld.cpp
LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp
LEGO1/lego/legoomni/src/input/legoinputmanager.cpp
LEGO1/lego/legoomni/src/main/legomain.cpp
LEGO1/lego/legoomni/src/main/scripts.cpp
LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp
LEGO1/lego/legoomni/src/paths/legoanimactor.cpp
LEGO1/lego/legoomni/src/paths/legoextraactor.cpp
LEGO1/lego/legoomni/src/paths/legopathactor.cpp
LEGO1/lego/legoomni/src/paths/legopathboundary.cpp
LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
LEGO1/lego/legoomni/src/paths/legopathpresenter.cpp
LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
LEGO1/lego/legoomni/src/race/carrace.cpp
LEGO1/lego/legoomni/src/race/jetskirace.cpp
LEGO1/lego/legoomni/src/race/legorace.cpp LEGO1/lego/legoomni/src/race/legorace.cpp
LEGO1/lego/legoomni/src/race/legoraceactor.cpp LEGO1/lego/legoomni/src/race/jetskirace.cpp
LEGO1/lego/legoomni/src/race/legoracemap.cpp LEGO1/lego/legoomni/src/race/carrace.cpp
LEGO1/lego/legoomni/src/race/legoracers.cpp LEGO1/lego/legoomni/src/actors/pizzeria.cpp
LEGO1/lego/legoomni/src/race/legoracespecial.cpp LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp
LEGO1/lego/legoomni/src/race/raceskel.cpp LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp
LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp LEGO1/lego/legoomni/src/actors/act2genactor.cpp
LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp LEGO1/lego/legoomni/src/actors/act2actor.cpp
LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp LEGO1/lego/legoomni/src/actors/islepathactor.cpp
LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp LEGO1/lego/legoomni/src/paths/legoanimactor.cpp
LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp LEGO1/lego/legoomni/src/entity/legoworld.cpp
LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp LEGO1/lego/legoomni/src/build/legocarbuild.cpp
LEGO1/lego/legoomni/src/video/legopartpresenter.cpp LEGO1/lego/legoomni/src/actors/ambulance.cpp
LEGO1/lego/legoomni/src/common/legoplantmanager.cpp
LEGO1/lego/legoomni/src/actors/bumpbouy.cpp
LEGO1/modeldb/modeldb.cpp
LEGO1/lego/legoomni/src/actors/pizza.cpp
LEGO1/lego/legoomni/src/actors/racecar.cpp
LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp
LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp
LEGO1/lego/legoomni/src/paths/legoextraactor.cpp
LEGO1/lego/legoomni/src/actors/isleactor.cpp
LEGO1/lego/legoomni/src/actors/radio.cpp
LEGO1/lego/legoomni/src/entity/legoactor.cpp
LEGO1/lego/legoomni/src/paths/legopathactor.cpp
LEGO1/lego/legoomni/src/common/legobuildingmanager.cpp
LEGO1/lego/legoomni/src/worlds/isle.cpp
LEGO1/lego/legoomni/src/actors/motorcycle.cpp
LEGO1/lego/legoomni/src/actors/act3ammo.cpp
LEGO1/lego/legoomni/src/audio/legocachesoundmanager.cpp
LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp
LEGO1/lego/legoomni/src/common/legogamestate.cpp
LEGO1/lego/legoomni/src/common/legobackgroundcolor.cpp
LEGO1/lego/legoomni/src/common/legofullscreenmovie.cpp
LEGO1/lego/legoomni/src/common/legoutils.cpp
LEGO1/lego/legoomni/src/actors/act3actors.cpp
LEGO1/lego/legoomni/src/control/legometerpresenter.cpp
LEGO1/lego/legoomni/src/common/legoactioncontrolpresenter.cpp
LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp
LEGO1/lego/legoomni/src/paths/legopathpresenter.cpp
LEGO1/lego/legoomni/src/common/legophoneme.cpp
LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp
LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp
LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp
LEGO1/lego/legoomni/src/common/mxtransitionmanager.cpp
LEGO1/lego/legoomni/src/actors/towtrack.cpp
LEGO1/lego/legoomni/src/entity/act2policestation.cpp
LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp
LEGO1/lego/legoomni/src/video/legotexturepresenter.cpp LEGO1/lego/legoomni/src/video/legotexturepresenter.cpp
LEGO1/lego/legoomni/src/video/legovideomanager.cpp
LEGO1/lego/legoomni/src/worlds/act3.cpp
LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp
LEGO1/lego/legoomni/src/worlds/gasstation.cpp
LEGO1/lego/legoomni/src/worlds/historybook.cpp
LEGO1/lego/legoomni/src/worlds/hospital.cpp
LEGO1/lego/legoomni/src/worlds/infocenter.cpp
LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp
LEGO1/lego/legoomni/src/worlds/isle.cpp
LEGO1/lego/legoomni/src/worlds/jukebox.cpp
LEGO1/lego/legoomni/src/worlds/legoact2.cpp LEGO1/lego/legoomni/src/worlds/legoact2.cpp
LEGO1/lego/legoomni/src/common/legovariables.cpp
LEGO1/lego/legoomni/src/main/scripts.cpp
LEGO1/lego/legoomni/src/entity/legoentitypresenter.cpp
LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp
LEGO1/lego/legoomni/src/paths/legopathboundary.cpp
LEGO1/lego/legoomni/src/main/legomain.cpp
LEGO1/lego/legoomni/src/input/legoinputmanager.cpp
LEGO1/lego/legoomni/src/race/legoracemap.cpp
LEGO1/lego/legoomni/src/worlds/jukebox.cpp
LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp
LEGO1/lego/legoomni/src/worlds/police.cpp LEGO1/lego/legoomni/src/worlds/police.cpp
LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp
LEGO1/lego/legoomni/src/entity/legopovcontroller.cpp
LEGO1/lego/legoomni/src/common/legotextureinfo.cpp
LEGO1/lego/legoomni/src/actors/doors.cpp
LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp
LEGO1/lego/legoomni/src/actors/dunebuggy.cpp
LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp
LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp
LEGO1/lego/legoomni/src/worlds/infocenter.cpp
LEGO1/lego/legoomni/src/race/raceskel.cpp
LEGO1/lego/legoomni/src/worlds/act3.cpp
LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp
LEGO1/lego/legoomni/src/common/mxcompositemediapresenter.cpp
LEGO1/lego/legoomni/src/worlds/hospital.cpp
LEGO1/lego/legoomni/src/actors/bike.cpp
LEGO1/lego/legoomni/src/entity/legoactorpresenter.cpp
LEGO1/lego/legoomni/src/worlds/registrationbook.cpp LEGO1/lego/legoomni/src/worlds/registrationbook.cpp
LEGO1/lego/legoomni/src/worlds/score.cpp LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp
LEGO1/lego/legoomni/src/entity/act2brick.cpp
LEGO1/lego/legoomni/src/video/legovideomanager.cpp
LEGO1/lego/legoomni/src/video/legopartpresenter.cpp
LEGO1/lego/legoomni/src/actors/jetski.cpp
LEGO1/lego/legoomni/src/audio/mxbackgroundaudiomanager.cpp
LEGO1/lego/legoomni/src/race/legoracespecial.cpp
LEGO1/lego/legoomni/src/worlds/historybook.cpp
LEGO1/lego/legoomni/src/common/legocharactermanager.cpp
LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp
LEGO1/main.cpp LEGO1/main.cpp
LEGO1/modeldb/modeldb.cpp # We need to get rid of / refactor the below units into existing/other ones
LEGO1/lego/legoomni/src/entity/legolocations.cpp
LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp
LEGO1/lego/legoomni/src/common/legoactors.cpp
LEGO1/define.cpp
LEGO1/lego/legoomni/src/common/legoplants.cpp
) )
list(APPEND list_targets ${NAME}) list(APPEND list_targets ${NAME})
@ -430,20 +425,20 @@ function(add_lego_libraries NAME)
# Link libraries # Link libraries
target_link_libraries(${NAME} PRIVATE target_link_libraries(${NAME} PRIVATE
tglrl${ARG_SUFFIX}
viewmanager${ARG_SUFFIX}
realtime${ARG_SUFFIX}
mxdirectx${ARG_SUFFIX}
roi${ARG_SUFFIX}
geom${ARG_SUFFIX}
anim${ARG_SUFFIX}
Vec::Vec
dinput dinput
dxguid
misc${ARG_SUFFIX} misc${ARG_SUFFIX}
geom${ARG_SUFFIX}
mxdirectx${ARG_SUFFIX}
anim${ARG_SUFFIX}
tglrl${ARG_SUFFIX}
realtime${ARG_SUFFIX}
viewmanager${ARG_SUFFIX}
roi${ARG_SUFFIX}
3dmanager${ARG_SUFFIX} 3dmanager${ARG_SUFFIX}
omni${ARG_SUFFIX} omni${ARG_SUFFIX}
shape${ARG_SUFFIX} shape${ARG_SUFFIX}
Vec::Vec
dxguid
) )
foreach(tgt IN LISTS list_targets) foreach(tgt IN LISTS list_targets)

View File

@ -19,13 +19,23 @@ class Act2Actor : public LegoAnimActor {
Act2Actor(); Act2Actor();
void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24 void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) override; // vtable+0x68
void Animate(float p_time) override; // vtable+0x70 // FUNCTION: LEGO1 0x1001a180
MxResult HitActor(LegoPathActor*, MxBool) override; // vtable+0x94 MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) override
MxResult VTable0x9c() override; // vtable+0x9c {
MxS32 VTable0xa0() override; // vtable+0xa0 if (m_unk0x1f) {
return 0;
}
return LegoAnimActor::VTable0x68(p_v1, p_v2, p_v3);
} // vtable+0x68
void Animate(float p_time) override; // vtable+0x70
MxResult HitActor(LegoPathActor*, MxBool) override; // vtable+0x94
MxResult VTable0x9c() override; // vtable+0x9c
MxS32 VTable0xa0() override; // vtable+0xa0
void FUN_10018980(); void FUN_10018980();
void FUN_10019250(MxFloat p_speed, MxFloat p_param2); void FUN_10019250(MxFloat p_speed, MxFloat p_param2);

View File

@ -10,6 +10,7 @@ class Act3Brickster;
class Act3Cop; class Act3Cop;
class Act3Shark; class Act3Shark;
class Helicopter; class Helicopter;
class MxQuaternionTransformer;
// Macros confirmed by BETA10 // Macros confirmed by BETA10
#define MAX_PIZZAS 20 #define MAX_PIZZAS 20
@ -53,6 +54,9 @@ class Act3State : public LegoState {
public: public:
Act3State() { m_unk0x08 = 0; } Act3State() { m_unk0x08 = 0; }
// FUNCTION: LEGO1 0x1000e2f0
MxBool IsSerializable() override { return FALSE; }
// FUNCTION: LEGO1 0x1000e300 // FUNCTION: LEGO1 0x1000e300
// FUNCTION: BETA10 0x10017e10 // FUNCTION: BETA10 0x10017e10
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -67,9 +71,6 @@ class Act3State : public LegoState {
return !strcmp(p_name, Act3State::ClassName()) || LegoState::IsA(p_name); return !strcmp(p_name, Act3State::ClassName()) || LegoState::IsA(p_name);
} }
// FUNCTION: LEGO1 0x1000e2f0
MxBool IsSerializable() override { return FALSE; }
// SYNTHETIC: LEGO1 0x1000e3c0 // SYNTHETIC: LEGO1 0x1000e3c0
// Act3State::`scalar deleting destructor' // Act3State::`scalar deleting destructor'
@ -152,7 +153,7 @@ class Act3 : public LegoWorld {
const Matrix4& p_destination, const Matrix4& p_destination,
const Matrix4& p_startPosition, const Matrix4& p_startPosition,
const Matrix4& p_endPosition, const Matrix4& p_endPosition,
const UnknownMx4DPointFloat& p_unk0x1f4 const MxQuaternionTransformer& p_unk0x1f4
); );
Act3State* m_state; // 0xf8 Act3State* m_state; // 0xf8

View File

@ -29,22 +29,28 @@ class AmbulanceMissionState : public LegoState {
MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c
// FUNCTION: BETA10 0x10088770
MxS16 GetHighScore(MxU8 p_actorId) MxS16 GetHighScore(MxU8 p_actorId)
{ {
switch (p_actorId) { switch (p_actorId) {
case LegoActor::c_pepper: case LegoActor::c_pepper:
return m_peHighScore; return m_peHighScore;
break;
case LegoActor::c_mama: case LegoActor::c_mama:
return m_maHighScore; return m_maHighScore;
break;
case LegoActor::c_papa: case LegoActor::c_papa:
return m_paHighScore; return m_paHighScore;
break;
case LegoActor::c_nick: case LegoActor::c_nick:
return m_niHighScore; return m_niHighScore;
break;
case LegoActor::c_laura: case LegoActor::c_laura:
return m_laHighScore; return m_laHighScore;
default: break;
return 0;
} }
return 0;
} }
// FUNCTION: BETA10 0x100242d0 // FUNCTION: BETA10 0x100242d0

View File

@ -5,80 +5,6 @@
class LegoEventNotificationParam; class LegoEventNotificationParam;
// VTABLE: LEGO1 0x100d48a8
// VTABLE: BETA10 0x101bd818
// SIZE 0x68
class RaceStandsEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000efa0
// FUNCTION: BETA10 0x100a9820
const char* ClassName() const override // vtable+0x0c
{
// at LEGO1 0x100f0300, needs no annotation
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000efb0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f9e0
// RaceStandsEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4a18
// VTABLE: BETA10 0x101bd7b0
// SIZE 0x68
class BeachHouseEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ee80
// FUNCTION: BETA10 0x100a96f0
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0314
return "BeachHouseEntity";
}
// FUNCTION: LEGO1 0x1000ee90
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f970
// BeachHouseEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4ab0
// VTABLE: BETA10 0x101bd748
// SIZE 0x68
class PoliceEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ed60
// FUNCTION: BETA10 0x100a95c0
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0328
return "PoliceEntity";
}
// FUNCTION: LEGO1 0x1000ed70
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f900
// PoliceEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4b90 // VTABLE: LEGO1 0x100d4b90
// VTABLE: BETA10 0x101bd610 // VTABLE: BETA10 0x101bd610
// SIZE 0x68 // SIZE 0x68
@ -104,79 +30,6 @@ class InfoCenterEntity : public BuildingEntity {
// InfoCenterEntity::`scalar deleting destructor' // InfoCenterEntity::`scalar deleting destructor'
}; };
// VTABLE: LEGO1 0x100d5068
// VTABLE: BETA10 0x101bd678
// SIZE 0x68
class HospitalEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ec40
// FUNCTION: BETA10 0x100a9360
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0338
return "HospitalEntity";
}
// FUNCTION: LEGO1 0x1000ec50
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f820
// HospitalEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d50c0
// VTABLE: BETA10 0x101bd880
// SIZE 0x68
class CaveEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000f1e0
// FUNCTION: BETA10 0x100a9950
const char* ClassName() const override // vtable+0x0c
{
// at LEGO1 0x100f0300, needs no annotation
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000f1f0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, CaveEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000fa50
// CaveEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d5200
// VTABLE: BETA10 0x101bd8e8
// SIZE 0x68
class JailEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000f0c0
// FUNCTION: BETA10 0x100a9a80
const char* ClassName() const override // vtable+0x0c
{
// at LEGO1 0x100f0300, needs no annotation
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000f0d0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000fac0
// JailEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d5258 // VTABLE: LEGO1 0x100d5258
// VTABLE: BETA10 0x101bd6e0 // VTABLE: BETA10 0x101bd6e0
// SIZE 0x68 // SIZE 0x68
@ -202,4 +55,151 @@ class GasStationEntity : public BuildingEntity {
// GasStationEntity::`scalar deleting destructor' // GasStationEntity::`scalar deleting destructor'
}; };
// VTABLE: LEGO1 0x100d5068
// VTABLE: BETA10 0x101bd678
// SIZE 0x68
class HospitalEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ec40
// FUNCTION: BETA10 0x100a9360
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0338
return "HospitalEntity";
}
// FUNCTION: LEGO1 0x1000ec50
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f820
// HospitalEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4ab0
// VTABLE: BETA10 0x101bd748
// SIZE 0x68
class PoliceEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ed60
// FUNCTION: BETA10 0x100a95c0
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0328
return "PoliceEntity";
}
// FUNCTION: LEGO1 0x1000ed70
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
// SYNTHETIC: LEGO1 0x1000f900
// PoliceEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4a18
// VTABLE: BETA10 0x101bd7b0
// SIZE 0x68
class BeachHouseEntity : public BuildingEntity {
public:
// FUNCTION: LEGO1 0x1000ee80
// FUNCTION: BETA10 0x100a96f0
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0314
return "BeachHouseEntity";
}
// FUNCTION: LEGO1 0x1000ee90
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f970
// BeachHouseEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d48a8
// VTABLE: BETA10 0x101bd818
// SIZE 0x68
class RaceStandsEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000efa0
// FUNCTION: BETA10 0x100a9820
const char* ClassName() const override // vtable+0x0c
{
// at LEGO1 0x100f0300, needs no annotation
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000efb0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000f9e0
// RaceStandsEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d5200
// VTABLE: BETA10 0x101bd8e8
// SIZE 0x68
class JailEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000f0c0
// FUNCTION: BETA10 0x100a9a80
const char* ClassName() const override // vtable+0x0c
{
// at LEGO1 0x100f0300, needs no annotation
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000f0d0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000fac0
// JailEntity::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d50c0
// VTABLE: BETA10 0x101bd880
// SIZE 0x68
class CaveEntity : public BuildingEntity {
// FUNCTION: LEGO1 0x1000f1e0
// FUNCTION: BETA10 0x100a9950
const char* ClassName() const override // vtable+0x0c
{
// at LEGO1 0x100f0300, needs no annotation
return "RaceStandsEntity";
}
// FUNCTION: LEGO1 0x1000f1f0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, CaveEntity::ClassName()) || BuildingEntity::IsA(p_name);
}
MxLong HandleClick(LegoEventNotificationParam& p_param) override;
// SYNTHETIC: LEGO1 0x1000fa50
// CaveEntity::`scalar deleting destructor'
};
#endif // BUILDINGS_H #endif // BUILDINGS_H

View File

@ -17,6 +17,9 @@ class ElevatorBottom : public LegoWorld {
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x10017f10
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10017f20 // FUNCTION: LEGO1 0x10017f20
// FUNCTION: BETA10 0x10028130 // FUNCTION: BETA10 0x10028130
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -33,12 +36,8 @@ class ElevatorBottom : public LegoWorld {
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool Escape() override; // vtable+0x64
// FUNCTION: LEGO1 0x10017f10 void Enable(MxBool p_enable) override; // vtable+0x68
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68
// SYNTHETIC: LEGO1 0x10018040 // SYNTHETIC: LEGO1 0x10018040
// ElevatorBottom::`scalar deleting destructor' // ElevatorBottom::`scalar deleting destructor'

View File

@ -14,11 +14,6 @@ class MxStillPresenter;
// SIZE 0x24 // SIZE 0x24
class GasStationState : public LegoState { class GasStationState : public LegoState {
public: public:
// SIZE 0x04
struct Unknown0x14 {
undefined4 m_unk0x00; // 0x00
};
GasStationState(); GasStationState();
// FUNCTION: LEGO1 0x100061d0 // FUNCTION: LEGO1 0x100061d0
@ -47,7 +42,7 @@ class GasStationState : public LegoState {
// TODO: Most likely getters/setters are not used according to BETA. // TODO: Most likely getters/setters are not used according to BETA.
GarageScript::Script m_actions[3]; // 0x08 GarageScript::Script m_actions[3]; // 0x08
Unknown0x14 m_unk0x14; // 0x14 undefined4 m_unk0x14; // 0x14
MxS16 m_pepperAction; // 0x18 MxS16 m_pepperAction; // 0x18
MxS16 m_mamaAction; // 0x1a MxS16 m_mamaAction; // 0x1a
MxS16 m_papaAction; // 0x1c MxS16 m_papaAction; // 0x1c
@ -66,6 +61,9 @@ class GasStation : public LegoWorld {
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
MxResult Tickle() override; // vtable+0x08 MxResult Tickle() override; // vtable+0x08
// FUNCTION: LEGO1 0x10004770
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10004780 // FUNCTION: LEGO1 0x10004780
// FUNCTION: BETA10 0x10029d40 // FUNCTION: BETA10 0x10029d40
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -82,7 +80,6 @@ class GasStation : public LegoWorld {
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool VTable0x5c() override; // vtable+0x5c
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68 void Enable(MxBool p_enable) override; // vtable+0x68
virtual MxLong HandleControl(LegoControlManagerNotificationParam& p_param); // vtable+0x6c virtual MxLong HandleControl(LegoControlManagerNotificationParam& p_param); // vtable+0x6c

View File

@ -3,7 +3,7 @@
#include "islepathactor.h" #include "islepathactor.h"
#include "legostate.h" #include "legostate.h"
#include "realtime/matrix.h" #include "mxgeometry/mxquaternion.h"
class Act3; class Act3;
@ -14,6 +14,16 @@ class HelicopterState : public LegoState {
public: public:
HelicopterState() : m_unk0x08(0) {} HelicopterState() : m_unk0x08(0) {}
// FUNCTION: LEGO1 0x1000e0b0
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000e0c0
MxBool Reset() override
{
m_unk0x08 = 0;
return TRUE;
} // vtable+0x18
// FUNCTION: LEGO1 0x1000e0d0 // FUNCTION: LEGO1 0x1000e0d0
// FUNCTION: BETA10 0x100a7cc0 // FUNCTION: BETA10 0x100a7cc0
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -28,24 +38,9 @@ class HelicopterState : public LegoState {
return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name); return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name);
} }
// FUNCTION: LEGO1 0x1000e0b0
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000e0c0
MxBool Reset() override
{
m_unk0x08 = 0;
return TRUE;
} // vtable+0x18
void SetUnknown8(MxU32 p_unk0x08) { m_unk0x08 = p_unk0x08; }
MxU32 GetUnkown8() { return m_unk0x08; }
// SYNTHETIC: LEGO1 0x1000e190 // SYNTHETIC: LEGO1 0x1000e190
// HelicopterState::`scalar deleting destructor' // HelicopterState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
MxU32 m_unk0x08; // 0x08 MxU32 m_unk0x08; // 0x08
}; };
@ -93,12 +88,12 @@ class Helicopter : public IslePathActor {
protected: protected:
void FUN_100042a0(const Matrix4& p_matrix); void FUN_100042a0(const Matrix4& p_matrix);
MxMatrix m_unk0x160; // 0x160 MxMatrix m_unk0x160; // 0x160
MxMatrix m_unk0x1a8; // 0x1a8 MxMatrix m_unk0x1a8; // 0x1a8
float m_unk0x1f0; // 0x1f0 float m_unk0x1f0; // 0x1f0
UnknownMx4DPointFloat m_unk0x1f4; // 0x1f4 MxQuaternionTransformer m_unk0x1f4; // 0x1f4
HelicopterState* m_state; // 0x228 HelicopterState* m_state; // 0x228
MxAtomId m_script; // 0x22c MxAtomId m_script; // 0x22c
}; };
#endif // HELICOPTER_H #endif // HELICOPTER_H

View File

@ -69,9 +69,9 @@ struct InfocenterMapEntry {
// FUNCTION: LEGO1 0x1006ec80 // FUNCTION: LEGO1 0x1006ec80
InfocenterMapEntry() {} InfocenterMapEntry() {}
MxStillPresenter* m_presenter; // 0x00 MxStillPresenter* m_destCtl; // 0x00
undefined4 m_unk0x04; // 0x04 undefined4 m_unk0x04; // 0x04
MxRect32 m_area; // 0x08 MxRect32 m_area; // 0x08
}; };
// VTABLE: LEGO1 0x100d9338 // VTABLE: LEGO1 0x100d9338
@ -161,9 +161,9 @@ class Infocenter : public LegoWorld {
Cutscene m_currentCutscene; // 0x108 Cutscene m_currentCutscene; // 0x108
Radio m_radio; // 0x10c Radio m_radio; // 0x10c
MxStillPresenter* m_unk0x11c; // 0x11c MxStillPresenter* m_unk0x11c; // 0x11c
InfocenterMapEntry m_mapAreas[7]; // 0x120 InfocenterMapEntry m_glowInfo[7]; // 0x120
MxS16 m_unk0x1c8; // 0x1c8 MxS16 m_unk0x1c8; // 0x1c8
MxStillPresenter* m_frameHotBitmap; // 0x1cc MxStillPresenter* m_frame; // 0x1cc
MxS16 m_infoManDialogueTimer; // 0x1d0 MxS16 m_infoManDialogueTimer; // 0x1d0
MxS16 m_bookAnimationTimer; // 0x1d2 MxS16 m_bookAnimationTimer; // 0x1d2
MxU16 m_unk0x1d4; // 0x1d4 MxU16 m_unk0x1d4; // 0x1d4

View File

@ -14,22 +14,7 @@ class MxNotificationParam;
// SIZE 0x7c // SIZE 0x7c
class IsleActor : public LegoActor { class IsleActor : public LegoActor {
public: public:
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x1000e660
// FUNCTION: BETA10 0x100a8300
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f07dc
return "IsleActor";
}
// FUNCTION: LEGO1 0x1000e670
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, IsleActor::ClassName()) || LegoActor::IsA(p_name);
}
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
// FUNCTION: LEGO1 0x1000e5f0 // FUNCTION: LEGO1 0x1000e5f0
@ -53,6 +38,20 @@ class IsleActor : public LegoActor {
// FUNCTION: LEGO1 0x1000e650 // FUNCTION: LEGO1 0x1000e650
virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x80 virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x80
// FUNCTION: LEGO1 0x1000e660
// FUNCTION: BETA10 0x100a8300
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f07dc
return "IsleActor";
}
// FUNCTION: LEGO1 0x1000e670
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, IsleActor::ClassName()) || LegoActor::IsA(p_name);
}
protected: protected:
LegoWorld* m_world; // 0x78 LegoWorld* m_world; // 0x78
}; };

View File

@ -86,6 +86,26 @@ class IslePathActor : public LegoPathActor {
IslePathActor(); IslePathActor();
// FUNCTION: LEGO1 0x10002e70
virtual MxLong HandleClick() { return 0; } // vtable+0xcc
// FUNCTION: LEGO1 0x10002df0
virtual MxLong HandleNotification0() { return 0; } // vtable+0xd0
// FUNCTION: LEGO1 0x10002e80
virtual MxLong HandleControl(LegoControlManagerNotificationParam&) { return 0; } // vtable+0xd4
// FUNCTION: LEGO1 0x10002e90
virtual MxLong HandleEndAnim(LegoEndAnimNotificationParam&) { return 0; } // vtable+0xd8
// FUNCTION: LEGO1 0x10002e00
virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0xdc
virtual void Enter(); // vtable+0xe0
virtual void Exit(); // vtable+0xe4
virtual void SpawnPlayer(LegoGameState::Area p_area, MxBool p_enter, MxU8 p_flags); // vtable+0xe8
virtual void VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundary, MxBool p_reset); // vtable+0xec
// FUNCTION: LEGO1 0x10002e10 // FUNCTION: LEGO1 0x10002e10
~IslePathActor() override { IslePathActor::Destroy(TRUE); } ~IslePathActor() override { IslePathActor::Destroy(TRUE); }
@ -108,29 +128,6 @@ class IslePathActor : public LegoPathActor {
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c
// FUNCTION: LEGO1 0x10002e70
virtual MxLong HandleClick() { return 0; } // vtable+0xcc
// FUNCTION: LEGO1 0x10002df0
virtual MxLong HandleNotification0() { return 0; } // vtable+0xd0
// FUNCTION: LEGO1 0x10002e80
virtual MxLong HandleControl(LegoControlManagerNotificationParam&) { return 0; } // vtable+0xd4
// FUNCTION: LEGO1 0x10002e90
virtual MxLong HandleEndAnim(LegoEndAnimNotificationParam&) { return 0; } // vtable+0xd8
// FUNCTION: LEGO1 0x10002e00
virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0xdc
virtual void Enter(); // vtable+0xe0
virtual void Exit(); // vtable+0xe4
virtual void SpawnPlayer(LegoGameState::Area p_area, MxBool p_enter, MxU8 p_flags); // vtable+0xe8
virtual void VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundary, MxBool p_reset); // vtable+0xec
// SYNTHETIC: LEGO1 0x10002ff0
// IslePathActor::`scalar deleting destructor'
void FUN_1001b660(); void FUN_1001b660();
void Reset() void Reset()
@ -143,6 +140,9 @@ class IslePathActor : public LegoPathActor {
static void RegisterSpawnLocations(); static void RegisterSpawnLocations();
// SYNTHETIC: LEGO1 0x10002ff0
// IslePathActor::`scalar deleting destructor'
protected: protected:
LegoWorld* m_world; // 0x154 LegoWorld* m_world; // 0x154
LegoPathActor* m_previousActor; // 0x158 LegoPathActor* m_previousActor; // 0x158

View File

@ -3,32 +3,6 @@
#include "legorace.h" #include "legorace.h"
// VTABLE: LEGO1 0x100d4fa8
// VTABLE: BETA10 0x101bd5d0
// SIZE 0x2c
class JetskiRaceState : public RaceState {
public:
// FUNCTION: LEGO1 0x1000dc40
// FUNCTION: BETA10 0x100a8f30
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00ac
// STRING: BETA10 0x101f1d0c
return "JetskiRaceState";
}
// FUNCTION: LEGO1 0x1000dc50
// FUNCTION: BETA10 0x100a8f60
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x1000f680
// SYNTHETIC: BETA10 0x100a9d10
// JetskiRaceState::`scalar deleting destructor'
};
// VTABLE: LEGO1 0x100d4fe8 // VTABLE: LEGO1 0x100d4fe8
// VTABLE: BETA10 0x101bd268 // VTABLE: BETA10 0x101bd268
// SIZE 0x144 // SIZE 0x144
@ -68,6 +42,32 @@ class JetskiRace : public LegoRace {
static MxS32 g_unk0x100f0c78; static MxS32 g_unk0x100f0c78;
}; };
// VTABLE: LEGO1 0x100d4fa8
// VTABLE: BETA10 0x101bd5d0
// SIZE 0x2c
class JetskiRaceState : public RaceState {
public:
// FUNCTION: LEGO1 0x1000dc40
// FUNCTION: BETA10 0x100a8f30
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f00ac
// STRING: BETA10 0x101f1d0c
return "JetskiRaceState";
}
// FUNCTION: LEGO1 0x1000dc50
// FUNCTION: BETA10 0x100a8f60
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x1000f680
// SYNTHETIC: BETA10 0x100a9d10
// JetskiRaceState::`scalar deleting destructor'
};
// SYNTHETIC: LEGO1 0x1000f530 // SYNTHETIC: LEGO1 0x1000f530
// SYNTHETIC: BETA10 0x100a9b70 // SYNTHETIC: BETA10 0x100a9b70
// JetskiRace::`scalar deleting destructor' // JetskiRace::`scalar deleting destructor'

View File

@ -24,6 +24,9 @@ class JukeBoxState : public LegoState {
JukeBoxState() : m_music(e_pasquell), m_active(FALSE) {} JukeBoxState() : m_music(e_pasquell), m_active(FALSE) {}
// FUNCTION: LEGO1 0x1000f300
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000f310 // FUNCTION: LEGO1 0x1000f310
// FUNCTION: BETA10 0x100389c0 // FUNCTION: BETA10 0x100389c0
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -38,9 +41,6 @@ class JukeBoxState : public LegoState {
return !strcmp(p_name, JukeBoxState::ClassName()) || LegoState::IsA(p_name); return !strcmp(p_name, JukeBoxState::ClassName()) || LegoState::IsA(p_name);
} }
// FUNCTION: LEGO1 0x1000f300
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// SYNTHETIC: LEGO1 0x1000f3d0 // SYNTHETIC: LEGO1 0x1000f3d0
// JukeBoxState::`scalar deleting destructor' // JukeBoxState::`scalar deleting destructor'

View File

@ -22,6 +22,9 @@ class LegoAct2State : public LegoState {
} }
~LegoAct2State() override {} ~LegoAct2State() override {}
// FUNCTION: LEGO1 0x1000df70
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000df80 // FUNCTION: LEGO1 0x1000df80
// FUNCTION: BETA10 0x1003c7e0 // FUNCTION: BETA10 0x1003c7e0
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -36,9 +39,6 @@ class LegoAct2State : public LegoState {
return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name); return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name);
} }
// FUNCTION: LEGO1 0x1000df70
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// SYNTHETIC: LEGO1 0x1000e040 // SYNTHETIC: LEGO1 0x1000e040
// LegoAct2State::`scalar deleting destructor' // LegoAct2State::`scalar deleting destructor'

View File

@ -3,6 +3,7 @@
#include "decomp.h" #include "decomp.h"
#include "legoentity.h" #include "legoentity.h"
#include "mxgeometry/mxmatrix.h"
class LegoCacheSound; class LegoCacheSound;

View File

@ -7,7 +7,7 @@
#include "legostate.h" #include "legostate.h"
#include "legotraninfolist.h" #include "legotraninfolist.h"
#include "mxcore.h" #include "mxcore.h"
#include "mxgeometry/mxgeometry3d.h" #include "mxgeometry/mxquaternion.h"
class LegoAnimPresenter; class LegoAnimPresenter;
class LegoEntity; class LegoEntity;
@ -258,46 +258,46 @@ class LegoAnimationManager : public MxCore {
void FUN_100648f0(LegoTranInfo* p_tranInfo, MxLong p_unk0x404); void FUN_100648f0(LegoTranInfo* p_tranInfo, MxLong p_unk0x404);
void FUN_10064b50(MxLong p_time); void FUN_10064b50(MxLong p_time);
LegoOmni::World m_worldId; // 0x08 LegoOmni::World m_worldId; // 0x08
MxU16 m_animCount; // 0x0c MxU16 m_animCount; // 0x0c
MxU16 m_unk0x0e; // 0x0e MxU16 m_unk0x0e; // 0x0e
MxU16 m_unk0x10; // 0x10 MxU16 m_unk0x10; // 0x10
AnimInfo* m_anims; // 0x14 AnimInfo* m_anims; // 0x14
undefined2 m_unk0x18; // 0x18 undefined2 m_unk0x18; // 0x18
MxBool m_unk0x1a; // 0x1a MxBool m_unk0x1a; // 0x1a
MxU32 m_unk0x1c; // 0x1c MxU32 m_unk0x1c; // 0x1c
LegoTranInfoList* m_tranInfoList; // 0x20 LegoTranInfoList* m_tranInfoList; // 0x20
LegoTranInfoList* m_tranInfoList2; // 0x24 LegoTranInfoList* m_tranInfoList2; // 0x24
MxPresenter* m_unk0x28[2]; // 0x28 MxPresenter* m_unk0x28[2]; // 0x28
MxLong m_unk0x30[2]; // 0x30 MxLong m_unk0x30[2]; // 0x30
MxBool m_unk0x38; // 0x38 MxBool m_unk0x38; // 0x38
MxBool m_animRunning; // 0x39 MxBool m_animRunning; // 0x39
MxBool m_enableCamAnims; // 0x3a MxBool m_enableCamAnims; // 0x3a
Extra m_extras[40]; // 0x3c Extra m_extras[40]; // 0x3c
MxU32 m_lastExtraCharacterId; // 0x3fc MxU32 m_lastExtraCharacterId; // 0x3fc
MxBool m_unk0x400; // 0x400 MxBool m_unk0x400; // 0x400
MxBool m_unk0x401; // 0x401 MxBool m_unk0x401; // 0x401
MxBool m_unk0x402; // 0x402 MxBool m_unk0x402; // 0x402
MxLong m_unk0x404; // 0x404 MxLong m_unk0x404; // 0x404
MxLong m_unk0x408; // 0x408 MxLong m_unk0x408; // 0x408
MxLong m_unk0x40c; // 0x40c MxLong m_unk0x40c; // 0x40c
MxLong m_unk0x410; // 0x410 MxLong m_unk0x410; // 0x410
MxU32 m_unk0x414; // 0x414 MxU32 m_unk0x414; // 0x414
MxU32 m_numAllowedExtras; // 0x418 MxU32 m_numAllowedExtras; // 0x418
undefined4 m_unk0x41c; // 0x41c undefined4 m_unk0x41c; // 0x41c
AnimState* m_animState; // 0x420 AnimState* m_animState; // 0x420
LegoROIList* m_unk0x424; // 0x424 LegoROIList* m_unk0x424; // 0x424
MxBool m_suspendedEnableCamAnims; // 0x428 MxBool m_suspendedEnableCamAnims; // 0x428
MxBool m_unk0x429; // 0x429 MxBool m_unk0x429; // 0x429
MxBool m_unk0x42a; // 0x42a MxBool m_unk0x42a; // 0x42a
MxBool m_suspended; // 0x42b MxBool m_suspended; // 0x42b
LegoTranInfo* m_unk0x42c; // 0x42c LegoTranInfo* m_unk0x42c; // 0x42c
MxBool m_unk0x430; // 0x430 MxBool m_unk0x430; // 0x430
MxLong m_unk0x434; // 0x434 MxLong m_unk0x434; // 0x434
MxLong m_unk0x438; // 0x438 MxLong m_unk0x438; // 0x438
MxMatrix m_unk0x43c; // 0x43c MxMatrix m_unk0x43c; // 0x43c
MxMatrix m_unk0x484; // 0x484 MxMatrix m_unk0x484; // 0x484
UnknownMx4DPointFloat m_unk0x4cc; // 0x4cc MxQuaternionTransformer m_unk0x4cc; // 0x4cc
}; };
// TEMPLATE: LEGO1 0x10061750 // TEMPLATE: LEGO1 0x10061750

View File

@ -7,7 +7,6 @@
class LegoAnim; class LegoAnim;
class LegoWorld; class LegoWorld;
class LegoAnimActor;
class LegoPathBoundary; class LegoPathBoundary;
class MxMatrix; class MxMatrix;
class Vector3; class Vector3;

View File

@ -4,6 +4,7 @@
#include "legogamestate.h" #include "legogamestate.h"
#include "legostate.h" #include "legostate.h"
#include "legoworld.h" #include "legoworld.h"
#include "mxgeometry/mxquaternion.h"
class LegoCarBuildAnimPresenter; class LegoCarBuildAnimPresenter;
class LegoControlManagerNotificationParam; class LegoControlManagerNotificationParam;
@ -189,7 +190,7 @@ class LegoCarBuild : public LegoWorld {
MxS32 m_unk0x250[2]; // 0x250 MxS32 m_unk0x250[2]; // 0x250
LegoCarBuildAnimPresenter* m_unk0x258; // 0x258 LegoCarBuildAnimPresenter* m_unk0x258; // 0x258
UnknownMx4DPointFloat m_unk0x25c; // 0x25c MxQuaternionTransformer m_unk0x25c; // 0x25c
// These two are likely locations in pixel space // These two are likely locations in pixel space
MxS32 m_unk0x290[2]; // 0x290 MxS32 m_unk0x290[2]; // 0x290

View File

@ -67,7 +67,7 @@ class LegoCharacterManager {
void ReleaseActor(const char* p_name); void ReleaseActor(const char* p_name);
void ReleaseActor(LegoROI* p_roi); void ReleaseActor(LegoROI* p_roi);
void ReleaseAutoROI(LegoROI* p_roi); void ReleaseAutoROI(LegoROI* p_roi);
MxBool FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo); MxBool FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_texture);
LegoExtraActor* GetExtraActor(const char* p_name); LegoExtraActor* GetExtraActor(const char* p_name);
LegoActorInfo* GetActorInfo(const char* p_name); LegoActorInfo* GetActorInfo(const char* p_name);
LegoActorInfo* GetActorInfo(LegoROI* p_roi); LegoActorInfo* GetActorInfo(LegoROI* p_roi);

View File

@ -86,6 +86,8 @@ class LegoEntity : public MxEntity {
MxBool GetUnknown0x10IsSet(MxU8 p_flag) { return m_unk0x10 & p_flag; } MxBool GetUnknown0x10IsSet(MxU8 p_flag) { return m_unk0x10 & p_flag; }
MxBool GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; } MxBool GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; }
MxU8 GetFlags() { return m_flags; } MxU8 GetFlags() { return m_flags; }
// FUNCTION: BETA10 0x10049db0
MxFloat GetWorldSpeed() { return m_worldSpeed; } MxFloat GetWorldSpeed() { return m_worldSpeed; }
// FUNCTION: BETA10 0x1000f2f0 // FUNCTION: BETA10 0x1000f2f0

View File

@ -4,6 +4,8 @@
#include "legoloopinganimpresenter.h" #include "legoloopinganimpresenter.h"
#include "legoroimaplist.h" #include "legoroimaplist.h"
class LegoAnimActor;
// VTABLE: LEGO1 0x100d9170 // VTABLE: LEGO1 0x100d9170
// SIZE 0xd8 // SIZE 0xd8
class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter {

View File

@ -18,6 +18,9 @@ class LegoModelPresenter : public MxVideoPresenter {
// FUNCTION: LEGO1 0x10067a10 // FUNCTION: LEGO1 0x10067a10
~LegoModelPresenter() override { Destroy(TRUE); } ~LegoModelPresenter() override { Destroy(TRUE); }
// FUNCTION: LEGO1 0x1000cca0
void Destroy() override { Destroy(FALSE); } // vtable+0x38
static void configureLegoModelPresenter(MxS32 p_modelPresenterConfig); static void configureLegoModelPresenter(MxS32 p_modelPresenterConfig);
// FUNCTION: BETA10 0x100a7180 // FUNCTION: BETA10 0x100a7180
@ -42,7 +45,6 @@ class LegoModelPresenter : public MxVideoPresenter {
void ReadyTickle() override; // vtable+0x18 void ReadyTickle() override; // vtable+0x18
void ParseExtra() override; // vtable+0x30 void ParseExtra() override; // vtable+0x30
void Destroy() override; // vtable+0x38
MxResult FUN_1007ff70(MxDSChunk& p_chunk, LegoEntity* p_entity, MxBool p_roiVisible, LegoWorld* p_world); MxResult FUN_1007ff70(MxDSChunk& p_chunk, LegoEntity* p_entity, MxBool p_roiVisible, LegoWorld* p_world);

View File

@ -12,7 +12,18 @@ class LegoNamedPart {
m_name = p_name; m_name = p_name;
m_list = p_list; m_list = p_list;
} }
~LegoNamedPart() { delete m_list; } ~LegoNamedPart()
{
LegoLODListCursor cursor(m_list);
LegoLOD* lod;
while (cursor.First(lod)) {
cursor.Detach();
delete lod;
}
delete m_list;
}
const MxString* GetName() const { return &m_name; } const MxString* GetName() const { return &m_name; }
LegoLODList* GetList() { return m_list; } LegoLODList* GetList() { return m_list; }

View File

@ -13,6 +13,9 @@ class LegoPartPresenter : public MxMediaPresenter {
// FUNCTION: LEGO1 0x10067300 // FUNCTION: LEGO1 0x10067300
~LegoPartPresenter() override { Destroy(TRUE); } ~LegoPartPresenter() override { Destroy(TRUE); }
// FUNCTION: LEGO1 0x1000cf60
void Destroy() override { Destroy(FALSE); } // vtable+0x38
// FUNCTION: BETA10 0x100a75d0 // FUNCTION: BETA10 0x100a75d0
static const char* HandlerClassName() static const char* HandlerClassName()
{ {
@ -35,7 +38,6 @@ class LegoPartPresenter : public MxMediaPresenter {
void ReadyTickle() override; // vtable+0x18 void ReadyTickle() override; // vtable+0x18
MxResult AddToManager() override; // vtable+0x34 MxResult AddToManager() override; // vtable+0x34
void Destroy() override; // vtable+0x38
static void configureLegoPartPresenter(MxS32, MxS32); static void configureLegoPartPresenter(MxS32, MxS32);

View File

@ -3,7 +3,6 @@
#include "legoactor.h" #include "legoactor.h"
#include "misc/legounknown.h" #include "misc/legounknown.h"
#include "mxgeometry/mxmatrix.h"
#include "mxtypes.h" #include "mxtypes.h"
struct LegoEdge; struct LegoEdge;
@ -92,8 +91,8 @@ class LegoPathActor : public LegoActor {
float p_srcScale, float p_srcScale,
LegoUnknown100db7f4& p_destEdge, LegoUnknown100db7f4& p_destEdge,
float p_destScale float p_destScale
); // vtable+0x88 ); // vtable+0x88
virtual MxS32 VTable0x8c(float p_time, Matrix4& p_transform); // vtable+0x8c virtual MxS32 VTable0x8c(float p_time, MxMatrix& p_transform); // vtable+0x8c
// FUNCTION: LEGO1 0x10002d40 // FUNCTION: LEGO1 0x10002d40
virtual MxU32 VTable0x90(float, Matrix4&) { return FALSE; } // vtable+0x90 virtual MxU32 VTable0x90(float, Matrix4&) { return FALSE; } // vtable+0x90

View File

@ -34,6 +34,8 @@ class RaceState : public LegoState {
} }
MxS16 GetUnknown0x02() { return m_unk0x02; } MxS16 GetUnknown0x02() { return m_unk0x02; }
// FUNCTION: BETA10 0x10088970
MxS16 GetHighScore() { return m_score; } MxS16 GetHighScore() { return m_score; }
// FUNCTION: BETA10 0x100c96f0 // FUNCTION: BETA10 0x100c96f0
@ -110,6 +112,19 @@ class LegoRace : public LegoWorld {
return "LegoRace"; return "LegoRace";
} }
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
virtual MxLong HandleClick(LegoEventNotificationParam&) = 0; // vtable+0x6c
// FUNCTION: LEGO1 0x10015b70
virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x70
// FUNCTION: LEGO1 0x10015b80
virtual MxLong HandleEndAction(MxEndActionNotificationParam&) { return 0; } // vtable+0x74
// FUNCTION: LEGO1 0x10015b90
MxBool Escape() override { return FALSE; } // vtable+0x64
// FUNCTION: LEGO1 0x10015ba0 // FUNCTION: LEGO1 0x10015ba0
// FUNCTION: BETA10 0x100a8940 // FUNCTION: BETA10 0x100a8940
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -124,17 +139,6 @@ class LegoRace : public LegoWorld {
return !strcmp(p_name, LegoRace::ClassName()) || LegoWorld::IsA(p_name); return !strcmp(p_name, LegoRace::ClassName()) || LegoWorld::IsA(p_name);
} }
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
// FUNCTION: LEGO1 0x1000dae0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68
virtual MxLong HandleClick(LegoEventNotificationParam&) = 0; // vtable+0x6c
virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&); // vtable+0x70
virtual MxLong HandleEndAction(MxEndActionNotificationParam&); // vtable+0x74
// FUNCTION: LEGO1 0x1000dab0 // FUNCTION: LEGO1 0x1000dab0
virtual MxLong HandleType0Notification(MxNotificationParam&) { return 0; } // vtable+0x78 virtual MxLong HandleType0Notification(MxNotificationParam&) { return 0; } // vtable+0x78
@ -145,6 +149,11 @@ class LegoRace : public LegoWorld {
m_maps[p_index] = p_map; m_maps[p_index] = p_map;
} }
// FUNCTION: LEGO1 0x1000dae0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
void Enable(MxBool p_enable) override; // vtable+0x68
// SYNTHETIC: LEGO1 0x10015cc0 // SYNTHETIC: LEGO1 0x10015cc0
// LegoRace::`scalar deleting destructor' // LegoRace::`scalar deleting destructor'

View File

@ -34,9 +34,7 @@ class LegoRaceActor : public virtual LegoAnimActor {
MxU32 VTable0x90(float p_time, Matrix4& p_matrix) override; // vtable+0x90 MxU32 VTable0x90(float p_time, Matrix4& p_matrix) override; // vtable+0x90
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
// FUNCTION: LEGO1 0x10014aa0 virtual MxResult FUN_10014aa0();
// FUNCTION: BETA10 0x100ca038
virtual MxResult FUN_10014aa0() { return SUCCESS; }
// SYNTHETIC: LEGO1 0x10012c10 // SYNTHETIC: LEGO1 0x10012c10
// LegoRaceActor::`vbase destructor' // LegoRaceActor::`vbase destructor'

View File

@ -25,81 +25,6 @@ struct SkeletonKickPhase {
MxU8 m_userState; // 0x0c MxU8 m_userState; // 0x0c
}; };
// VTABLE: LEGO1 0x100d58a0 LegoRaceActor
// VTABLE: LEGO1 0x100d58a8 LegoAnimActor
// VTABLE: LEGO1 0x100d58b8 LegoPathActor
// VTABLE: LEGO1 0x100d5984 LegoRaceMap
// VTABLE: LEGO1 0x100d5988 LegoCarRaceActor
// VTABLE: BETA10 0x101be6ec LegoRaceActor
// VTABLE: BETA10 0x101be6f0 LegoAnimActor
// VTABLE: BETA10 0x101be708 LegoPathActor
// VTABLE: BETA10 0x101be7f8 LegoRaceMap
// VTABLE: BETA10 0x101be800 LegoCarRaceActor
// SIZE 0x200
class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
public:
LegoRaceCar();
~LegoRaceCar() override;
MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x100142a0
// FUNCTION: BETA10 0x100cd500
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0548
return "LegoRaceCar";
}
// FUNCTION: LEGO1 0x100142c0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoRaceCar::ClassName()) || LegoCarRaceActor::IsA(p_name);
}
void ParseAction(char* p_extra) override; // vtable+0x20
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
MxU32 VTable0x6c(
LegoPathBoundary* p_boundary,
Vector3& p_v1,
Vector3& p_v2,
float p_f1,
float p_f2,
Vector3& p_v3
) override; // vtable+0x6c
void Animate(float p_time) override; // vtable+0x70
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
override; // vtable+0x98
MxResult VTable0x9c() override; // vtable+0x9c
virtual void SetMaxLinearVelocity(float p_maxLinearVelocity);
virtual void FUN_10012ff0(float p_param);
virtual MxU32 HandleSkeletonKicks(float p_param1);
static void FUN_10012de0();
static void FUN_10012e00();
static void FUN_10013670();
// SYNTHETIC: LEGO1 0x10014240
// LegoRaceCar::`scalar deleting destructor'
private:
undefined m_userState; // 0x54
float m_unk0x58; // 0x58
Mx3DPointFloat m_unk0x5c; // 0x5c
// Names verified by BETA10 0x100cb4a9
LegoAnimActorStruct* m_skelKick1Anim; // 0x70
LegoAnimActorStruct* m_skelKick2Anim; // 0x74
// Name verified by BETA10 0x100cb4f0
LegoPathBoundary* m_kick1B; // 0x78
// Name verified by BETA10 0x100cb537
LegoPathBoundary* m_kick2B; // 0x7c
};
// VTABLE: LEGO1 0x100d5a08 LegoCarRaceActor // VTABLE: LEGO1 0x100d5a08 LegoCarRaceActor
// VTABLE: LEGO1 0x100d5a28 LegoRaceActor // VTABLE: LEGO1 0x100d5a28 LegoRaceActor
// VTABLE: LEGO1 0x100d5a30 LegoAnimActor // VTABLE: LEGO1 0x100d5a30 LegoAnimActor
@ -134,19 +59,25 @@ class LegoJetski : public LegoJetskiRaceActor, public LegoRaceMap {
void ParseAction(char* p_extra) override; // vtable+0x20 void ParseAction(char* p_extra) override; // vtable+0x20
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
MxU32 VTable0x6c(
LegoPathBoundary* p_boundary, // FUNCTION: LEGO1 0x10014150
Vector3& p_v1, MxU32 VTable0x6c(LegoPathBoundary* p_boundary, Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3)
Vector3& p_v2, override
float p_f1, {
float p_f2, return LegoJetskiRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
Vector3& p_v3 } // vtable+0x6c
) override; // vtable+0x6c
void Animate(float p_time) override; // vtable+0x70 void Animate(float p_time) override; // vtable+0x70
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
override; // vtable+0x98 // FUNCTION: LEGO1 0x100141d0
MxResult VTable0x9c() override; // vtable+0x9c void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override
{
LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
} // vtable+0x98
// FUNCTION: LEGO1 0x10014210
MxResult VTable0x9c() override { return LegoJetskiRaceActor::VTable0x9c(); } // vtable+0x9c
virtual void FUN_100136f0(float p_worldSpeed); virtual void FUN_100136f0(float p_worldSpeed);
@ -154,6 +85,88 @@ class LegoJetski : public LegoJetskiRaceActor, public LegoRaceMap {
// LegoJetski::`scalar deleting destructor' // LegoJetski::`scalar deleting destructor'
}; };
// VTABLE: LEGO1 0x100d58a0 LegoRaceActor
// VTABLE: LEGO1 0x100d58a8 LegoAnimActor
// VTABLE: LEGO1 0x100d58b8 LegoPathActor
// VTABLE: LEGO1 0x100d5984 LegoRaceMap
// VTABLE: LEGO1 0x100d5988 LegoCarRaceActor
// VTABLE: BETA10 0x101be6ec LegoRaceActor
// VTABLE: BETA10 0x101be6f0 LegoAnimActor
// VTABLE: BETA10 0x101be708 LegoPathActor
// VTABLE: BETA10 0x101be7f8 LegoRaceMap
// VTABLE: BETA10 0x101be800 LegoCarRaceActor
// SIZE 0x200
class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
public:
LegoRaceCar();
~LegoRaceCar() override;
MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x100142a0
// FUNCTION: BETA10 0x100cd500
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f0548
return "LegoRaceCar";
}
// FUNCTION: LEGO1 0x100142c0
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoRaceCar::ClassName()) || LegoCarRaceActor::IsA(p_name);
}
void ParseAction(char* p_extra) override; // vtable+0x20
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
// FUNCTION: LEGO1 0x10014500
// FUNCTION: BETA10 0x100cd5e0
MxU32 VTable0x6c(LegoPathBoundary* p_boundary, Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3)
override
{
return LegoCarRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
} // vtable+0x6c
void Animate(float p_time) override; // vtable+0x70
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
// FUNCTION: LEGO1 0x10014560
// FUNCTION: BETA10 0x100cd660
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override
{
LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
} // vtable+0x98
MxResult VTable0x9c() override; // vtable+0x9c
virtual void SetMaxLinearVelocity(float p_maxLinearVelocity);
virtual void FUN_10012ff0(float p_param);
virtual MxU32 HandleSkeletonKicks(float p_param1);
static void FUN_10012de0();
static void FUN_10012e00();
static void FUN_10013670();
// SYNTHETIC: LEGO1 0x10014240
// LegoRaceCar::`scalar deleting destructor'
private:
undefined m_userState; // 0x54
float m_unk0x58; // 0x58
Mx3DPointFloat m_unk0x5c; // 0x5c
// Names verified by BETA10 0x100cb4a9
LegoAnimActorStruct* m_skelKick1Anim; // 0x70
LegoAnimActorStruct* m_skelKick2Anim; // 0x74
// Name verified by BETA10 0x100cb4f0
LegoPathBoundary* m_kick1B; // 0x78
// Name verified by BETA10 0x100cb537
LegoPathBoundary* m_kick2B; // 0x7c
};
// GLOBAL: LEGO1 0x100d5890 // GLOBAL: LEGO1 0x100d5890
// LegoRaceCar::`vbtable'{for `LegoCarRaceActor'} // LegoRaceCar::`vbtable'{for `LegoCarRaceActor'}

View File

@ -84,22 +84,6 @@ class LegoState : public MxCore {
// FUNCTION: LEGO1 0x10005f40 // FUNCTION: LEGO1 0x10005f40
~LegoState() override {} ~LegoState() override {}
// FUNCTION: LEGO1 0x100060d0
// FUNCTION: BETA10 0x10017d20
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f01b8
// STRING: BETA10 0x101dcdac
return "LegoState";
}
// FUNCTION: LEGO1 0x100060e0
// FUNCTION: BETA10 0x100a9000
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoState::ClassName()) || MxCore::IsA(p_name);
}
// FUNCTION: LEGO1 0x10005f90 // FUNCTION: LEGO1 0x10005f90
virtual MxBool IsSerializable() { return TRUE; } // vtable+0x14 virtual MxBool IsSerializable() { return TRUE; } // vtable+0x14
@ -116,6 +100,22 @@ class LegoState : public MxCore {
return SUCCESS; return SUCCESS;
} // vtable+0x1c } // vtable+0x1c
// FUNCTION: LEGO1 0x100060d0
// FUNCTION: BETA10 0x10017d20
const char* ClassName() const override // vtable+0x0c
{
// STRING: LEGO1 0x100f01b8
// STRING: BETA10 0x101dcdac
return "LegoState";
}
// FUNCTION: LEGO1 0x100060e0
// FUNCTION: BETA10 0x100a9000
MxBool IsA(const char* p_name) const override // vtable+0x10
{
return !strcmp(p_name, LegoState::ClassName()) || MxCore::IsA(p_name);
}
// SYNTHETIC: LEGO1 0x10006160 // SYNTHETIC: LEGO1 0x10006160
// LegoState::`scalar deleting destructor' // LegoState::`scalar deleting destructor'
}; };

View File

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

View File

@ -102,7 +102,7 @@ class LegoWorld : public LegoEntity {
MxCore* Find(const MxAtomId& p_atom, MxS32 p_entityId); MxCore* Find(const MxAtomId& p_atom, MxS32 p_entityId);
// FUNCTION: BETA10 0x1002b4f0 // FUNCTION: BETA10 0x1002b4f0
LegoCameraController* GetCamera() { return m_cameraController; } LegoCameraController* GetCameraController() { return m_cameraController; }
LegoEntityList* GetEntityList() { return m_entityList; } LegoEntityList* GetEntityList() { return m_entityList; }
LegoOmni::World GetWorldId() { return m_worldId; } LegoOmni::World GetWorldId() { return m_worldId; }

View File

@ -148,6 +148,7 @@ class PizzaMissionState : public LegoState {
// FUNCTION: BETA10 0x100ef850 // FUNCTION: BETA10 0x100ef850
MxU32 GetUnknown0xb0() { return m_unk0xb0; } MxU32 GetUnknown0xb0() { return m_unk0xb0; }
// FUNCTION: BETA10 0x10088850
MxS16 GetHighScore(MxU8 p_actorId) { return GetMission(p_actorId)->m_hiScore; } MxS16 GetHighScore(MxU8 p_actorId) { return GetMission(p_actorId)->m_hiScore; }
// SYNTHETIC: LEGO1 0x10039350 // SYNTHETIC: LEGO1 0x10039350

View File

@ -15,6 +15,16 @@ class ScoreState : public LegoState {
public: public:
ScoreState() : m_playCubeTutorial(TRUE) {} ScoreState() : m_playCubeTutorial(TRUE) {}
// FUNCTION: LEGO1 0x1000de20
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000de30
MxBool Reset() override
{
m_playCubeTutorial = TRUE;
return TRUE;
} // vtable+0x18
// FUNCTION: LEGO1 0x1000de40 // FUNCTION: LEGO1 0x1000de40
// FUNCTION: BETA10 0x100a7a70 // FUNCTION: BETA10 0x100a7a70
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -29,16 +39,6 @@ class ScoreState : public LegoState {
return !strcmp(p_name, ScoreState::ClassName()) || LegoState::IsA(p_name); return !strcmp(p_name, ScoreState::ClassName()) || LegoState::IsA(p_name);
} }
// FUNCTION: LEGO1 0x1000de20
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000de30
MxBool Reset() override
{
m_playCubeTutorial = TRUE;
return TRUE;
} // vtable+0x18
MxBool GetTutorialFlag() { return m_playCubeTutorial; } MxBool GetTutorialFlag() { return m_playCubeTutorial; }
void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; } void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; }
@ -59,6 +59,9 @@ class Score : public LegoWorld {
~Score() override; ~Score() override;
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x100010b0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x100010c0 // FUNCTION: LEGO1 0x100010c0
// FUNCTION: BETA10 0x100f4f20 // FUNCTION: BETA10 0x100f4f20
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -78,14 +81,13 @@ class Score : public LegoWorld {
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool VTable0x5c() override; // vtable+0x5c
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68 void Enable(MxBool p_enable) override; // vtable+0x68
void Paint(); void Paint();
MxLong FUN_10001510(MxEndActionNotificationParam& p_param); MxLong FUN_10001510(MxEndActionNotificationParam& p_param);
MxLong FUN_100016d0(LegoControlManagerNotificationParam& p_param); MxLong FUN_100016d0(LegoControlManagerNotificationParam& p_param);
void FillArea(MxU32 i_activity, MxU32 i_actor, MxS16 score); void FillArea(MxS32 i_activity, MxS32 i_actor, MxS16 score);
protected: protected:
void DeleteScript(); void DeleteScript();

View File

@ -30,22 +30,28 @@ class TowTrackMissionState : public LegoState {
MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c
// FUNCTION: BETA10 0x10088890
MxS16 GetHighScore(MxU8 p_actorId) MxS16 GetHighScore(MxU8 p_actorId)
{ {
switch (p_actorId) { switch (p_actorId) {
case LegoActor::c_pepper: case LegoActor::c_pepper:
return m_peHighScore; return m_peHighScore;
break;
case LegoActor::c_mama: case LegoActor::c_mama:
return m_maHighScore; return m_maHighScore;
break;
case LegoActor::c_papa: case LegoActor::c_papa:
return m_paHighScore; return m_paHighScore;
break;
case LegoActor::c_nick: case LegoActor::c_nick:
return m_niHighScore; return m_niHighScore;
break;
case LegoActor::c_laura: case LegoActor::c_laura:
return m_laHighScore; return m_laHighScore;
default: break;
return 0;
} }
return 0;
} }
// FUNCTION: BETA10 0x100f8530 // FUNCTION: BETA10 0x100f8530

View File

@ -311,7 +311,7 @@ void Act2Actor::Animate(float p_time)
local30 -= local60; local30 -= local60;
local30.Unitize(); local30.Unitize();
MxFloat dotproduct = local18.Dot(&local30, &local18); MxFloat dotproduct = local18.Dot(local30, local18);
if (dotproduct >= 0.0) { if (dotproduct >= 0.0) {
const MxFloat* pepperWorldPosition = roiPepper->GetWorldPosition(); const MxFloat* pepperWorldPosition = roiPepper->GetWorldPosition();
@ -444,6 +444,8 @@ MxS32 Act2Actor::VTable0xa0()
{ {
undefined4 newLocation; undefined4 newLocation;
assert(!m_grec);
CurrentWorld(); CurrentWorld();
MxU16 randomVal = rand() / (RAND_MAX / 2) + 1; MxU16 randomVal = rand() / (RAND_MAX / 2) + 1;
@ -613,9 +615,9 @@ MxU32 Act2Actor::FUN_10019700(MxFloat p_param)
col2 = col3; col2 = col3;
col2 -= m_unk0x4c->GetROI()->GetWorldPosition(); col2 -= m_unk0x4c->GetROI()->GetWorldPosition();
col2.Unitize(); col2.Unitize();
col0.EqualsCross(&col1, &col2); col0.EqualsCross(col1, col2);
col0.Unitize(); col0.Unitize();
col1.EqualsCross(&col2, &col0); col1.EqualsCross(col2, col0);
assert(!m_cameraFlag); assert(!m_cameraFlag);
@ -867,13 +869,3 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
return result; return result;
} }
// FUNCTION: LEGO1 0x1001a180
MxS32 Act2Actor::VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3)
{
if (m_unk0x1f) {
return 0;
}
return LegoAnimActor::VTable0x68(p_v1, p_v2, p_v3);
}

View File

@ -238,7 +238,7 @@ void Act3Cop::ParseAction(char* p_extra)
for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) {
Mx4DPointFloat* edgeNormal = boundary->GetEdgeNormal(j); Mx4DPointFloat* edgeNormal = boundary->GetEdgeNormal(j);
if (point.Dot(edgeNormal, &point) + edgeNormal->index_operator(3) < -0.001) { if (point.Dot(*edgeNormal, point) + edgeNormal->index_operator(3) < -0.001) {
MxTrace("Bad Act3 cop destination %d\n", i); MxTrace("Bad Act3 cop destination %d\n", i);
break; break;
} }
@ -246,8 +246,8 @@ void Act3Cop::ParseAction(char* p_extra)
Mx4DPointFloat* boundary0x14 = boundary->GetUnknown0x14(); Mx4DPointFloat* boundary0x14 = boundary->GetUnknown0x14();
if (point.Dot(&point, boundary0x14) + boundary0x14->index_operator(3) <= 0.001 && if (point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) <= 0.001 &&
point.Dot(&point, boundary0x14) + boundary0x14->index_operator(3) >= -0.001) { point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) >= -0.001) {
continue; continue;
} }
@ -496,9 +496,9 @@ MxResult Act3Cop::FUN_10040360()
v3 = v4; v3 = v4;
v3 -= vecUnk; v3 -= vecUnk;
v3.Unitize(); v3.Unitize();
v1.EqualsCross(&v2, &v3); v1.EqualsCross(v2, v3);
v1.Unitize(); v1.Unitize();
v2.EqualsCross(&v3, &v1); v2.EqualsCross(v3, v1);
VTable0x9c(); VTable0x9c();
} }
@ -628,9 +628,9 @@ void Act3Brickster::Animate(float p_time)
localc = local20; localc = local20;
localc -= m_pInfo->m_position; localc -= m_pInfo->m_position;
localc.Unitize(); localc.Unitize();
local14.EqualsCross(&local28, &localc); local14.EqualsCross(local28, localc);
local14.Unitize(); local14.Unitize();
local28.EqualsCross(&localc, &local14); local28.EqualsCross(localc, local14);
assert(!m_cameraFlag); assert(!m_cameraFlag);
@ -675,9 +675,9 @@ void Act3Brickster::Animate(float p_time)
local80 -= m_unk0x3c; local80 -= m_unk0x3c;
local80.Unitize(); local80.Unitize();
local88.EqualsCross(&local9c, &local80); local88.EqualsCross(local9c, local80);
local88.Unitize(); local88.Unitize();
local9c.EqualsCross(&local80, &local88); local9c.EqualsCross(local80, local88);
assert(!m_cameraFlag); assert(!m_cameraFlag);
@ -991,9 +991,9 @@ MxResult Act3Brickster::FUN_100417c0()
v3 = v4; v3 = v4;
v3 -= vecUnk; v3 -= vecUnk;
v3.Unitize(); v3.Unitize();
v1.EqualsCross(&v2, &v3); v1.EqualsCross(v2, v3);
v1.Unitize(); v1.Unitize();
v2.EqualsCross(&v3, &v1); v2.EqualsCross(v3, v1);
VTable0x9c(); VTable0x9c();
@ -1087,7 +1087,7 @@ MxS32 Act3Brickster::FUN_10042300()
local18 = local64[local1c]; local18 = local64[local1c];
local18 -= local38; local18 -= local38;
if (maxE == NULL || (local18.Dot(&local94, &local18) < 0.0f && local78 < local98)) { if (maxE == NULL || (local18.Dot(local94, local18) < 0.0f && local78 < local98)) {
maxE = e; maxE = e;
m_boundary = boundaries[i]; m_boundary = boundaries[i];
local78 = local98; local78 = local98;

View File

@ -227,12 +227,12 @@ MxResult Act3Ammo::FUN_10053db0(float p_param1, const Matrix4& p_param2)
local14[1] = local14[2] = 0.0f; local14[1] = local14[2] = 0.0f;
local14[0] = 1.0f; local14[0] = 1.0f;
local3c.EqualsCross(&localc, &local14); local3c.EqualsCross(localc, local14);
if (local3c.Unitize() != 0) { if (local3c.Unitize() != 0) {
local14[0] = local14[1] = 0.0f; local14[0] = local14[1] = 0.0f;
local14[2] = 1.0f; local14[2] = 1.0f;
local3c.EqualsCross(&localc, &local14); local3c.EqualsCross(localc, local14);
if (local3c.Unitize() != 0) { if (local3c.Unitize() != 0) {
assert(0); assert(0);
@ -240,7 +240,7 @@ MxResult Act3Ammo::FUN_10053db0(float p_param1, const Matrix4& p_param2)
} }
} }
local14.EqualsCross(&local3c, &localc); local14.EqualsCross(local3c, localc);
return SUCCESS; return SUCCESS;
} }
@ -340,17 +340,17 @@ void Act3Ammo::Animate(float p_time)
local184 = *m_boundary->GetUnknown0x14(); local184 = *m_boundary->GetUnknown0x14();
local17c[0] = 1.0f; local17c[0] = 1.0f;
local17c[1] = local17c[2] = 0.0f; local17c[1] = local17c[2] = 0.0f;
local174.EqualsCross(&local17c, &local184); local174.EqualsCross(local17c, local184);
local174.Unitize(); local174.Unitize();
local17c.EqualsCross(&local184, &local174); local17c.EqualsCross(local184, local174);
} }
else { else {
local17c = *m_boundary->GetUnknown0x14(); local17c = *m_boundary->GetUnknown0x14();
local184[0] = 1.0f; local184[0] = 1.0f;
local184[1] = local184[2] = 0.0f; local184[1] = local184[2] = 0.0f;
local174.EqualsCross(&local17c, &local184); local174.EqualsCross(local17c, local184);
local174.Unitize(); local174.Unitize();
local184.EqualsCross(&local174, &local17c); local184.EqualsCross(local174, local17c);
} }
} }

View File

@ -21,11 +21,16 @@
DECOMP_SIZE_ASSERT(Helicopter, 0x230) DECOMP_SIZE_ASSERT(Helicopter, 0x230)
DECOMP_SIZE_ASSERT(HelicopterState, 0x0c) DECOMP_SIZE_ASSERT(HelicopterState, 0x0c)
DECOMP_SIZE_ASSERT(Vector2, 0x08)
DECOMP_SIZE_ASSERT(Vector3, 0x08)
DECOMP_SIZE_ASSERT(Vector4, 0x08)
DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14) DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14)
DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18) DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18)
DECOMP_SIZE_ASSERT(Matrix4, 0x08)
DECOMP_SIZE_ASSERT(MxMatrix, 0x48) DECOMP_SIZE_ASSERT(MxMatrix, 0x48)
// FUNCTION: LEGO1 0x10001e60 // FUNCTION: LEGO1 0x10001e60
// FUNCTION: BETA10 0x1002a0d0
Helicopter::Helicopter() Helicopter::Helicopter()
{ {
m_maxLinearVel = 60; m_maxLinearVel = 60;
@ -39,6 +44,7 @@ Helicopter::~Helicopter()
} }
// FUNCTION: LEGO1 0x100032c0 // FUNCTION: LEGO1 0x100032c0
// FUNCTION: BETA10 0x1002a16d
MxResult Helicopter::Create(MxDSAction& p_dsAction) MxResult Helicopter::Create(MxDSAction& p_dsAction)
{ {
MxResult result = IslePathActor::Create(p_dsAction); MxResult result = IslePathActor::Create(p_dsAction);
@ -48,6 +54,8 @@ MxResult Helicopter::Create(MxDSAction& p_dsAction)
((Act3*) m_world)->SetHelicopter(this); ((Act3*) m_world)->SetHelicopter(this);
} }
assert(m_world);
if (m_world != NULL) { if (m_world != NULL) {
m_world->Add(this); m_world->Add(this);
} }
@ -57,6 +65,7 @@ MxResult Helicopter::Create(MxDSAction& p_dsAction)
} }
// FUNCTION: LEGO1 0x10003320 // FUNCTION: LEGO1 0x10003320
// FUNCTION: BETA10 0x1002a240
void Helicopter::CreateState() void Helicopter::CreateState()
{ {
m_state = (HelicopterState*) GameState()->GetState("HelicopterState"); m_state = (HelicopterState*) GameState()->GetState("HelicopterState");
@ -66,8 +75,11 @@ void Helicopter::CreateState()
} }
// FUNCTION: LEGO1 0x10003360 // FUNCTION: LEGO1 0x10003360
// FUNCTION: BETA10 0x1002a29a
void Helicopter::Exit() void Helicopter::Exit()
{ {
assert(UserActor() == this);
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
SpawnPlayer( SpawnPlayer(
LegoGameState::e_unk40, LegoGameState::e_unk40,
@ -90,7 +102,7 @@ void Helicopter::Exit()
} }
} }
m_state->SetUnknown8(0); m_state->m_unk0x08 = 0;
RemoveFromCurrentWorld(m_script, IsleScript::c_HelicopterDashboard_Bitmap); RemoveFromCurrentWorld(m_script, IsleScript::c_HelicopterDashboard_Bitmap);
RemoveFromCurrentWorld(m_script, IsleScript::c_HelicopterArms_Ctl); RemoveFromCurrentWorld(m_script, IsleScript::c_HelicopterArms_Ctl);
RemoveFromCurrentWorld(m_script, IsleScript::c_Helicopter_TakeOff_Ctl); RemoveFromCurrentWorld(m_script, IsleScript::c_Helicopter_TakeOff_Ctl);
@ -106,6 +118,7 @@ void Helicopter::Exit()
} }
// FUNCTION: LEGO1 0x10003480 // FUNCTION: LEGO1 0x10003480
// FUNCTION: BETA10 0x1002a3db
MxLong Helicopter::HandleClick() MxLong Helicopter::HandleClick()
{ {
if (!FUN_1003ef60()) { if (!FUN_1003ef60()) {
@ -114,6 +127,7 @@ MxLong Helicopter::HandleClick()
if (!m_world) { if (!m_world) {
m_world = CurrentWorld(); m_world = CurrentWorld();
assert(m_world);
} }
AnimationManager()->FUN_1005f6d0(FALSE); AnimationManager()->FUN_1005f6d0(FALSE);
@ -159,6 +173,8 @@ MxLong Helicopter::HandleClick()
MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param) MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
{ {
MxLong result = 0; MxLong result = 0;
assert(m_world);
MxAtomId script; MxAtomId script;
switch (GameState()->GetCurrentAct()) { switch (GameState()->GetCurrentAct()) {
@ -195,9 +211,10 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
break; break;
} }
Act1State* state = (Act1State*) GameState()->GetState("Act1State"); Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
assert(act1State);
if (m_state->m_unk0x08 == 0) { if (m_state->m_unk0x08 == 0) {
state->m_unk0x018 = 4; act1State->m_unk0x018 = 4;
m_state->m_unk0x08 = 1; m_state->m_unk0x08 = 1;
m_world->RemoveActor(this); m_world->RemoveActor(this);
InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterTakeOff_Anim, NULL); InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterTakeOff_Anim, NULL);
@ -234,11 +251,11 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
assert(m_pathController); assert(m_pathController);
if (m_world && m_world->GetCamera()) { if (m_world && m_world->GetCameraController()) {
Mx3DPointFloat location, direction, lookat; Mx3DPointFloat location, direction, lookat;
location = m_world->GetCamera()->GetWorldLocation(); location = m_world->GetCameraController()->GetWorldLocation();
direction = m_world->GetCamera()->GetWorldDirection(); direction = m_world->GetCameraController()->GetWorldDirection();
lookat = direction; lookat = direction;
lookat *= 3.0f; lookat *= 3.0f;
@ -246,9 +263,9 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
Mx3DPointFloat v68, va4, up; Mx3DPointFloat v68, va4, up;
Mx3DPointFloat v90(0, 1, 0); Mx3DPointFloat v90(0, 1, 0);
v68 = m_world->GetCamera()->GetWorldUp(); v68 = m_world->GetCameraController()->GetWorldUp();
va4.EqualsCross(&v68, &direction); va4.EqualsCross(v68, direction);
up.EqualsCross(&va4, &v90); up.EqualsCross(va4, v90);
if (isPizza) { if (isPizza) {
if (((Act3*) m_world)->ShootPizza(m_pathController, location, direction, up) != SUCCESS) { if (((Act3*) m_world)->ShootPizza(m_pathController, location, direction, up) != SUCCESS) {
@ -291,14 +308,17 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
} }
// FUNCTION: LEGO1 0x10003c20 // FUNCTION: LEGO1 0x10003c20
// FUNCTION: BETA10 0x1002ab4c
MxLong Helicopter::HandleEndAnim(LegoEndAnimNotificationParam& p_param) MxLong Helicopter::HandleEndAnim(LegoEndAnimNotificationParam& p_param)
{ {
MxU32 ret = 0; MxLong result = 0;
switch (m_state->GetUnkown8()) { switch (m_state->m_unk0x08) {
case 1: { case 1: {
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
((Act1State*) GameState()->GetState("Act1State"))->SetUnknown18(4); Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
assert(act1State);
act1State->m_unk0x018 = 4;
SpawnPlayer( SpawnPlayer(
LegoGameState::e_unk42, LegoGameState::e_unk42,
TRUE, TRUE,
@ -313,25 +333,17 @@ MxLong Helicopter::HandleEndAnim(LegoEndAnimNotificationParam& p_param)
); );
} }
m_state->SetUnknown8(2); m_state->m_unk0x08 = 2;
MxMatrix matrix; MxMatrix matrix;
matrix.SetIdentity(); matrix.SetIdentity();
matrix.RotateX(0.5235987901687622); // PI / 6, 30 deg
float s = sin(0.5235987901687622); // PI / 6, 30 deg
float c = cos(0.5235987901687622); // PI / 6, 30 deg
float matrixCopy[4][4];
memcpy(matrixCopy, matrix.GetData(), sizeof(matrixCopy));
for (MxS32 i = 0; i < 4; i++) {
matrix.GetData()[i][1] = matrixCopy[i][1] * c - matrixCopy[i][2] * s;
matrix.GetData()[i][2] = matrixCopy[i][2] * c + matrixCopy[i][1] * s;
}
Vector3 at(matrix[3]), dir(matrix[2]), up(matrix[1]); Vector3 at(matrix[3]), dir(matrix[2]), up(matrix[1]);
m_world->GetCamera()->SetWorldTransform(at, dir, up);
assert(m_world && m_world->GetCameraController());
m_world->GetCameraController()->SetWorldTransform(at, dir, up);
FUN_10010c30(); FUN_10010c30();
ret = 1; result = 1;
break; break;
} }
case 3: { case 3: {
@ -340,10 +352,14 @@ MxLong Helicopter::HandleEndAnim(LegoEndAnimNotificationParam& p_param)
Vector3 at(matrix[3]), dir(matrix[2]), up(matrix[1]); Vector3 at(matrix[3]), dir(matrix[2]), up(matrix[1]);
at[1] = 1.25; at[1] = 1.25;
m_world->GetCamera()->SetWorldTransform(at, dir, up);
assert(m_world && m_world->GetCameraController());
m_world->GetCameraController()->SetWorldTransform(at, dir, up);
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
((Act1State*) GameState()->GetState("Act1State"))->SetUnknown18(0); Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
assert(act1State);
act1State->m_unk0x018 = 0;
SpawnPlayer( SpawnPlayer(
LegoGameState::e_unk41, LegoGameState::e_unk41,
TRUE, TRUE,
@ -358,13 +374,13 @@ MxLong Helicopter::HandleEndAnim(LegoEndAnimNotificationParam& p_param)
); );
} }
m_state->SetUnknown8(0); m_state->m_unk0x08 = 0;
ret = 1; result = 1;
break; break;
} }
} }
return ret; return result;
} }
// FUNCTION: LEGO1 0x10003e90 // FUNCTION: LEGO1 0x10003e90
@ -403,14 +419,14 @@ void Helicopter::Animate(float p_time)
Vector3 v3(m_unk0x1a8[3]); Vector3 v3(m_unk0x1a8[3]);
mat.SetIdentity(); mat.SetIdentity();
m_unk0x1f4.BETA_1004aaa0(mat, f2); m_unk0x1f4.InterpolateToMatrix(mat, f2);
v2 = v3; v2 = v3;
v2 -= v1; v2 -= v1;
v2 *= f2; v2 *= f2;
v2 += v1; v2 += v1;
m_world->GetCamera()->FUN_100123e0(mat, 0); m_world->GetCameraController()->FUN_100123e0(mat, 0);
} }
else { else {
if (m_state->m_unk0x08 == 4) { if (m_state->m_unk0x08 == 4) {
@ -420,7 +436,7 @@ void Helicopter::Animate(float p_time)
((Act3*) m_world)->FUN_10073430(); ((Act3*) m_world)->FUN_10073430();
} }
LegoPathActor::m_actorState = c_disabled; SetActorState(c_disabled);
} }
} }
else { else {
@ -441,7 +457,7 @@ void Helicopter::FUN_100042a0(const Matrix4& p_matrix)
Vector3 vec5(m_unk0x1a8[2]); // EDI Vector3 vec5(m_unk0x1a8[2]); // EDI
Vector3 vec6(m_unk0x1a8[3]); // locala0 // esp+0x28 Vector3 vec6(m_unk0x1a8[3]); // locala0 // esp+0x28
m_world->GetCamera()->FUN_100123b0(local48); m_world->GetCameraController()->FUN_100123b0(local48);
m_unk0x1a8.SetIdentity(); m_unk0x1a8.SetIdentity();
local90 = p_matrix; local90 = p_matrix;
@ -453,9 +469,9 @@ void Helicopter::FUN_100042a0(const Matrix4& p_matrix)
vec5[0] = vec5[2] = 0.0f; vec5[0] = vec5[2] = 0.0f;
vec5[1] = -1.0f; vec5[1] = -1.0f;
vec3.EqualsCross(&vec4, &vec5); vec3.EqualsCross(vec4, vec5);
vec3.Unitize(); vec3.Unitize();
vec4.EqualsCross(&vec5, &vec3); vec4.EqualsCross(vec5, vec3);
vec6 = vec2; vec6 = vec2;
local90 = m_unk0x1a8; local90 = m_unk0x1a8;
@ -466,9 +482,8 @@ void Helicopter::FUN_100042a0(const Matrix4& p_matrix)
m_unk0x1f0 = Timer()->GetTime(); m_unk0x1f0 = Timer()->GetTime();
m_unk0x1f4.BETA_1004a9f0(local48); m_unk0x1f4.SetStartEnd(local48, local90);
m_unk0x1f4.FUN_10004620(local90); m_unk0x1f4.NormalizeDirection();
m_unk0x1f4.FUN_10004520();
} }
// FUNCTION: LEGO1 0x10004640 // FUNCTION: LEGO1 0x10004640

View File

@ -133,7 +133,7 @@ void IslePathActor::Exit()
for (j = 0; j < m_boundary->GetNumEdges(); j++) { for (j = 0; j < m_boundary->GetNumEdges(); j++) {
Mx4DPointFloat& normal = *m_boundary->GetEdgeNormal(j); Mx4DPointFloat& normal = *m_boundary->GetEdgeNormal(j);
if (local20.Dot(&normal, &local20) + normal[3] < -0.001) { if (local20.Dot(normal, local20) + normal[3] < -0.001) {
break; break;
} }
} }
@ -645,7 +645,7 @@ void IslePathActor::FUN_1001b660()
Vector3 up(transform[2]); Vector3 up(transform[2]);
up *= -1.0f; up *= -1.0f;
position.EqualsCross(&direction, &up); position.EqualsCross(direction, up);
m_roi->FUN_100a58f0(transform); m_roi->FUN_100a58f0(transform);
m_roi->VTable0x14(); m_roi->VTable0x14();
} }

View File

@ -624,6 +624,7 @@ MxResult PizzaMissionState::Serialize(LegoFile* p_file)
} }
// FUNCTION: LEGO1 0x10039510 // FUNCTION: LEGO1 0x10039510
// FUNCTION: BETA10 0x100eed45
PizzaMissionState::Mission* PizzaMissionState::GetMission(MxU8 p_actorId) PizzaMissionState::Mission* PizzaMissionState::GetMission(MxU8 p_actorId)
{ {
for (MxS16 i = 0; i < 5; i++) { for (MxS16 i = 0; i < 5; i++) {

View File

@ -358,7 +358,7 @@ void LegoCarBuild::VTable0x70()
m_unk0x2a0 = sqrt((MxDouble) DISTSQRD2(m_unk0x290, m_unk0x298)); m_unk0x2a0 = sqrt((MxDouble) DISTSQRD2(m_unk0x290, m_unk0x298));
m_unk0x25c.BETA_1004a9b0(m_unk0x178, m_unk0x208); m_unk0x25c.SetStartEnd(m_unk0x178, m_unk0x208);
} }
// FUNCTION: LEGO1 0x10023130 // FUNCTION: LEGO1 0x10023130
@ -406,7 +406,7 @@ void LegoCarBuild::FUN_10023130(MxLong p_x, MxLong p_y)
MxFloat local1c = sqrt((double) (NORMSQRD2(local20))) / m_unk0x2a0; MxFloat local1c = sqrt((double) (NORMSQRD2(local20))) / m_unk0x2a0;
m_unk0x25c.BETA_1004aaa0(local78, local1c); m_unk0x25c.InterpolateToMatrix(local78, local1c);
local78[3][0] = m_unk0x178[3][0] + local18[0]; local78[3][0] = m_unk0x178[3][0] + local18[0];
local78[3][1] = m_unk0x178[3][1] + local18[1]; local78[3][1] = m_unk0x178[3][1] + local18[1];
@ -1203,7 +1203,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
assert(destWorld); assert(destWorld);
m_buildState->m_animationState = LegoVehicleBuildState::e_exiting; m_buildState->m_animationState = LegoVehicleBuildState::e_exiting;
if (m_unk0x258->AllPartsPlaced()) { if (!m_unk0x258->AllPartsPlaced()) {
FUN_100243a0(); FUN_100243a0();
} }
else { else {
@ -1211,8 +1211,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
} }
} }
else { else {
MxNotificationParam param; NotificationManager()->Send(this, MxNotificationParam());
NotificationManager()->Send(this, param);
} }
break; break;
case 2: case 2:
@ -1239,9 +1238,8 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
FUN_10024ef0(); FUN_10024ef0();
} }
else { else {
MxNotificationParam p;
// In BETA10, NotificationManager->Send() also takes __FILE__ and __LINE__ arguments // In BETA10, NotificationManager->Send() also takes __FILE__ and __LINE__ arguments
NotificationManager()->Send(this, p); NotificationManager()->Send(this, MxNotificationParam());
} }
break; break;
} }

View File

@ -550,7 +550,7 @@ void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle)
Mx4DPointFloat newRotation; Mx4DPointFloat newRotation;
additionalRotation.NormalizeQuaternion(); additionalRotation.NormalizeQuaternion();
newRotation.EqualsHamiltonProduct(&currentRotation, &additionalRotation); newRotation.EqualsHamiltonProduct(currentRotation, additionalRotation);
if (newRotation[3] < 0.9999) { if (newRotation[3] < 0.9999) {
rotationKey->FUN_100739a0(TRUE); rotationKey->FUN_100739a0(TRUE);

View File

@ -8,88 +8,88 @@ DECOMP_SIZE_ASSERT(LegoActorLOD, 0x58)
// GLOBAL: LEGO1 0x100da3b0 // GLOBAL: LEGO1 0x100da3b0
LegoActorLOD g_actorLODs[] = { LegoActorLOD g_actorLODs[] = {
{"top", "top", 0, 0.000267, 0.780808, -0.01906, 0.951612, -0.461166, -0.002794, -0.299442, 0.4617, {"top", "top", 0, 0.000267f, 0.780808f, -0.01906f, 0.951612f, -0.461166f, -0.002794f, -0.299442f, 0.4617f,
1.56441, 0.261321, 0, 0, 0, 0, 0, 1, 0, 1, 0}, 1.56441f, 0.261321f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f},
{"body", "body", LegoActorLOD::c_flag1, {"body", "body", LegoActorLOD::c_flag1,
0.00158332, 0.401828, -0.00048697, 0.00158332f, 0.401828f, -0.00048697f,
0.408071, -0.287507, 0.150419, 0.408071f, -0.287507f, 0.150419f,
-0.147452, 0.289219, 0.649774, -0.147452f, 0.289219f, 0.649774f,
0.14258, -0.00089, 0.436353, 0.14258f, -0.00089f, 0.436353f,
0.007277, 0, 0, 0.007277f, 0.0f, 0.0f,
1, 0, 1, 1.0f, 0.0f, 1.0f,
0}, 0.0f},
{"infohat", "infohat", LegoActorLOD::c_flag2, {"infohat", "infohat", LegoActorLOD::c_flag2,
0, -0.00938, -0.01955, 0.0f, -0.00938f, -0.01955f,
0.35, -0.231822, -0.140237, 0.35f, -0.231822f, -0.140237f,
-0.320954, 0.234149, 0.076968, -0.320954f, 0.234149f, 0.076968f,
0.249083, 0.000191, 1.519793, 0.249083f, 0.000191f, 1.519793f,
0.001767, 0, 0, 0.001767f, 0.0f, 0.0f,
1, 0, 1, 1.0f, 0.0f, 1.0f,
0}, 0.0f},
{"infogron", "infogron", LegoActorLOD::c_flag2, {"infogron", "infogron", LegoActorLOD::c_flag2,
0, 0.11477, 0.00042, 0.0f, 0.11477f, 0.00042f,
0.26, -0.285558, -0.134391, 0.26f, -0.285558f, -0.134391f,
-0.142231, 0.285507, 0.152986, -0.142231f, 0.285507f, 0.152986f,
0.143071, -0.00089, 0.436353, 0.143071f, -0.00089f, 0.436353f,
0.007277, 0, 0, 0.007277f, 0.0f, 0.0f,
1, 0, 1, 1.0f, 0.0f, 1.0f,
0}, 0.0f},
{"head", "head", LegoActorLOD::c_flag1, {"head", "head", LegoActorLOD::c_flag1,
0, -0.03006, 0, 0.0f, -0.03006f, 0.0f,
0.3, -0.189506, -0.209665, 0.3f, -0.189506f, -0.209665f,
-0.189824, 0.189532, 0.228822, -0.189824f, 0.189532f, 0.228822f,
0.194945, -0.00105, 1.293115, 0.194945f, -0.00105f, 1.293115f,
0.001781, 0, 0, 0.001781f, 0.0f, 0.0f,
1, 0, 1, 1.0f, 0.0f, 1.0f,
0}, 0.0f},
{"arm-lft", "arm-lft", LegoActorLOD::c_flag2, {"arm-lft", "arm-lft", LegoActorLOD::c_flag2,
-0.06815, -0.0973747, 0.0154655, -0.06815f, -0.0973747f, 0.0154655f,
0.237, -0.137931, -0.282775, 0.237f, -0.137931f, -0.282775f,
-0.105316, 0.000989, 0.100221, -0.105316f, 0.000989f, 0.100221f,
0.140759, -0.225678, 0.963312, 0.140759f, -0.225678f, 0.963312f,
0.023286, -0.003031, -0.017187, 0.023286f, -0.003031f, -0.017187f,
0.999848, 0.173622, 0.984658, 0.999848f, 0.173622f, 0.984658f,
0.017453}, 0.017453f},
{"arm-rt", "arm-rt", LegoActorLOD::c_flag2, {"arm-rt", "arm-rt", LegoActorLOD::c_flag2,
0.0680946, -0.097152, 0.0152722, 0.0680946f, -0.097152f, 0.0152722f,
0.237, 0.00141, -0.289604, 0.237f, 0.00141f, -0.289604f,
-0.100831, 0.138786, 0.09291, -0.100831f, 0.138786f, 0.09291f,
0.145437, 0.223494, 0.963583, 0.145437f, 0.223494f, 0.963583f,
0.018302, 0, 0, 0.018302f, 0.0f, 0.0f,
1, -0.173648, 0.984808, 1.0f, -0.173648f, 0.984808f,
0}, 0.0f},
{"claw-lft", "claw-lft", LegoActorLOD::c_flag2, {"claw-lft", "claw-lft", LegoActorLOD::c_flag2,
0.000773381, -0.101422, -0.0237761, 0.000773381f, -0.101422f, -0.0237761f,
0.15, -0.089838, -0.246208, 0.15f, -0.089838f, -0.246208f,
-0.117735, 0.091275, 0.000263, -0.117735f, 0.091275f, 0.000263f,
0.07215, -0.341869, 0.700355, 0.07215f, -0.341869f, 0.700355f,
0.092779, 0.000001, 0.000003, 0.092779f, 0.000001f, 0.000003f,
1, 0.190812, 0.981627, 1.0f, 0.190812f, 0.981627f,
-0.000003}, -0.000003f},
{"claw-rt", "claw-lft", LegoActorLOD::c_flag2, {"claw-rt", "claw-lft", LegoActorLOD::c_flag2,
0.000773381, -0.101422, -0.0237761, 0.000773381f, -0.101422f, -0.0237761f,
0.15, -0.095016, -0.245349, 0.15f, -0.095016f, -0.245349f,
-0.117979, 0.086528, 0.00067, -0.117979f, 0.086528f, 0.00067f,
0.069743, 0.343317, 0.69924, 0.069743f, 0.343317f, 0.69924f,
0.096123, 0.00606, -0.034369, 0.096123f, 0.00606f, -0.034369f,
0.999391, -0.190704, 0.981027, 0.999391f, -0.190704f, 0.981027f,
0.034894}, 0.034894f},
{"leg-lft", "leg", LegoActorLOD::c_flag2, {"leg-lft", "leg", LegoActorLOD::c_flag2,
0.00433584, -0.177404, -0.0313928, 0.00433584f, -0.177404f, -0.0313928f,
0.33, -0.129782, -0.440428, 0.33f, -0.129782f, -0.440428f,
-0.184207, 0.13817, 0.118415, -0.184207f, 0.13817f, 0.118415f,
0.122607, -0.156339, 0.436087, 0.122607f, -0.156339f, 0.436087f,
0.006822, 0, 0, 0.006822f, 0.0f, 0.0f,
1, 0, 1, 1.0f, 0.0f, 1.0f,
0}, 0.0f},
{"leg-rt", "leg", LegoActorLOD::c_flag2, {"leg-rt", "leg", LegoActorLOD::c_flag2,
0.00433584, -0.177404, -0.0313928, 0.00433584f, -0.177404f, -0.0313928f,
0.33, -0.132864, -0.437138, 0.33f, -0.132864f, -0.437138f,
-0.183944, 0.134614, 0.12043, -0.183944f, 0.134614f, 0.12043f,
0.121888, 0.151154, 0.436296, 0.121888f, 0.151154f, 0.436296f,
0.007373, 0, 0, 0.007373f, 0.0f, 0.0f,
1, 0, 1, 1.0f, 0.0f, 1.0f,
0} 0.0f}
}; };
// GLOBAL: LEGO1 0x100da778 // GLOBAL: LEGO1 0x100da778

View File

@ -1596,7 +1596,7 @@ MxU16 LegoAnimationManager::FUN_10062110(
if (GetViewManager()->IsBoundingBoxInFrustum(p_roi->GetWorldBoundingBox())) { if (GetViewManager()->IsBoundingBoxInFrustum(p_roi->GetWorldBoundingBox())) {
Mx3DPointFloat direction(p_roi->GetWorldDirection()); Mx3DPointFloat direction(p_roi->GetWorldDirection());
if (direction.Dot(&direction, &p_direction) > 0.707) { if (direction.Dot(direction, p_direction) > 0.707) {
Mx3DPointFloat position(p_roi->GetWorldPosition()); Mx3DPointFloat position(p_roi->GetWorldPosition());
position -= p_position; position -= p_position;
@ -2342,11 +2342,11 @@ MxBool LegoAnimationManager::FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_
{ {
const char** cycles = g_cycles[g_characters[p_characterId].m_unk0x16]; const char** cycles = g_cycles[g_characters[p_characterId].m_unk0x16];
const char* vehicleWC; const char* vehicleWC;
LegoLocomotionAnimPresenter* presenter;
if (g_characters[p_characterId].m_vehicleId >= 0 && g_vehicles[g_characters[p_characterId].m_vehicleId].m_unk0x04 && if (g_characters[p_characterId].m_vehicleId >= 0 && g_vehicles[g_characters[p_characterId].m_vehicleId].m_unk0x04 &&
(vehicleWC = cycles[10]) != NULL) { (vehicleWC = cycles[10]) != NULL) {
LegoLocomotionAnimPresenter* presenter = presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) { if (presenter != NULL) {
presenter->FUN_1006d680(p_actor, 1.7f); presenter->FUN_1006d680(p_actor, 1.7f);
@ -2359,8 +2359,7 @@ MxBool LegoAnimationManager::FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_
else { else {
vehicleWC = cycles[p_mood]; vehicleWC = cycles[p_mood];
if (vehicleWC != NULL) { if (vehicleWC != NULL) {
LegoLocomotionAnimPresenter* presenter = presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) { if (presenter != NULL) {
presenter->FUN_1006d680(p_actor, 0.7f); presenter->FUN_1006d680(p_actor, 0.7f);
@ -2373,8 +2372,7 @@ MxBool LegoAnimationManager::FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_
vehicleWC = cycles[p_mood + 4]; vehicleWC = cycles[p_mood + 4];
if (vehicleWC != NULL) { if (vehicleWC != NULL) {
LegoLocomotionAnimPresenter* presenter = presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) { if (presenter != NULL) {
presenter->FUN_1006d680(p_actor, 4.0f); presenter->FUN_1006d680(p_actor, 4.0f);
@ -2387,8 +2385,7 @@ MxBool LegoAnimationManager::FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_
vehicleWC = cycles[p_mood + 7]; vehicleWC = cycles[p_mood + 7];
if (vehicleWC != NULL) { if (vehicleWC != NULL) {
LegoLocomotionAnimPresenter* presenter = presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) { if (presenter != NULL) {
presenter->FUN_1006d680(p_actor, 0.0f); presenter->FUN_1006d680(p_actor, 0.0f);
@ -2481,6 +2478,8 @@ MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoUnkn
Vector3* v1 = p_edge->CWVertex(*p_boundary); Vector3* v1 = p_edge->CWVertex(*p_boundary);
Vector3* v2 = p_edge->CCWVertex(*p_boundary); Vector3* v2 = p_edge->CCWVertex(*p_boundary);
assert(v1 && v2);
p1 = *v2; p1 = *v2;
p1 -= *v1; p1 -= *v1;
p1 *= p_destScale; p1 *= p_destScale;
@ -2493,7 +2492,12 @@ MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoUnkn
boundingBox.Min() -= vec; boundingBox.Min() -= vec;
boundingBox.Max() = p1; boundingBox.Max() = p1;
boundingBox.Max() += vec; boundingBox.Max() += vec;
return GetViewManager()->IsBoundingBoxInFrustum(boundingBox) == FALSE;
if (GetViewManager()->IsBoundingBoxInFrustum(boundingBox) == FALSE) {
return TRUE;
}
return FALSE;
} }
// FUNCTION: LEGO1 0x10064120 // FUNCTION: LEGO1 0x10064120
@ -2525,7 +2529,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
for (i = 0; i < numEdges; i++) { for (i = 0; i < numEdges; i++) {
e = (LegoUnknown100db7f4*) boundary->GetEdges()[i]; e = (LegoUnknown100db7f4*) boundary->GetEdges()[i];
e->FUN_1002ddc0(*boundary, vec); e->FUN_1002ddc0(*boundary, vec);
float dot = vec.Dot(&direction, &vec); float dot = vec.Dot(direction, vec);
if (dot > local4c) { if (dot > local4c) {
local50 = e; local50 = e;
@ -2793,8 +2797,8 @@ void LegoAnimationManager::FUN_100648f0(LegoTranInfo* p_tranInfo, MxLong p_unk0x
LegoLocation* location = NavController()->GetLocation(p_tranInfo->m_location); LegoLocation* location = NavController()->GetLocation(p_tranInfo->m_location);
if (location != NULL) { if (location != NULL) {
CalcLocalTransform(location->m_position, location->m_direction, location->m_up, m_unk0x484); CalcLocalTransform(location->m_position, location->m_direction, location->m_up, m_unk0x484);
m_unk0x4cc.BETA_1004a9b0(m_unk0x43c, m_unk0x484); m_unk0x4cc.SetStartEnd(m_unk0x43c, m_unk0x484);
m_unk0x4cc.FUN_10004520(); m_unk0x4cc.NormalizeDirection();
} }
else { else {
p_tranInfo->m_flags &= ~LegoTranInfo::c_bit1; p_tranInfo->m_flags &= ~LegoTranInfo::c_bit1;
@ -2828,7 +2832,7 @@ void LegoAnimationManager::FUN_10064b50(MxLong p_time)
sub[1] = (m_unk0x484[3][1] - m_unk0x43c[3][1]) * und; sub[1] = (m_unk0x484[3][1] - m_unk0x43c[3][1]) * und;
sub[2] = (m_unk0x484[3][2] - m_unk0x43c[3][2]) * und; sub[2] = (m_unk0x484[3][2] - m_unk0x43c[3][2]) * und;
m_unk0x4cc.BETA_1004aaa0(mat, (float) (p_time - m_unk0x434) / 1000.0f); m_unk0x4cc.InterpolateToMatrix(mat, (float) (p_time - m_unk0x434) / 1000.0f);
VPV3(mat[3], m_unk0x43c[3], sub); VPV3(mat[3], m_unk0x43c[3], sub);
mat[3][3] = 1.0f; mat[3][3] = 1.0f;

View File

@ -121,9 +121,9 @@ void LegoBackgroundColor::SetLightColor(float p_r, float p_g, float p_b)
{ {
if (!VideoManager()->GetVideoParam().Flags().GetF2bit0()) { if (!VideoManager()->GetVideoParam().Flags().GetF2bit0()) {
// TODO: Computed constants based on what? // TODO: Computed constants based on what?
p_r *= 4.3478260869565215; p_r *= 1. / 0.23;
p_g *= 1.5873015873015872; p_g *= 1. / 0.63;
p_b *= 1.1764705882352942; p_b *= 1. / 0.85;
if (p_r > 1.0) { if (p_r > 1.0) {
p_r = 1.0; p_r = 1.0;

View File

@ -809,7 +809,7 @@ MxResult LegoBuildingManager::FUN_10030630()
for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) {
Mx4DPointFloat* normal = boundary->GetEdgeNormal(j); Mx4DPointFloat* normal = boundary->GetEdgeNormal(j);
if (position.Dot(normal, &position) + (*normal).index_operator(3) < -0.001) { if (position.Dot(*normal, position) + (*normal).index_operator(3) < -0.001) {
MxTrace( MxTrace(
"Building %d shot location (%g, %g, %g) is not in boundary %s.\n", "Building %d shot location (%g, %g, %g) is not in boundary %s.\n",
i, i,
@ -826,8 +826,8 @@ MxResult LegoBuildingManager::FUN_10030630()
if (g_buildingInfo[i].m_boundary != NULL) { if (g_buildingInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_buildingInfo[i].m_boundary->GetUnknown0x14(); Mx4DPointFloat& unk0x14 = *g_buildingInfo[i].m_boundary->GetUnknown0x14();
if (position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) > 0.001 || if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 ||
position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) < -0.001) { position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) {
g_buildingInfo[i].m_y = g_buildingInfo[i].m_y =
-((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) + -((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) +

View File

@ -16,6 +16,7 @@
#include "roi/legolod.h" #include "roi/legolod.h"
#include "viewmanager/viewmanager.h" #include "viewmanager/viewmanager.h"
#include <assert.h>
#include <vec.h> #include <vec.h>
DECOMP_SIZE_ASSERT(LegoCharacter, 0x08) DECOMP_SIZE_ASSERT(LegoCharacter, 0x08)
@ -52,10 +53,11 @@ MxU32 g_unk0x100fc4f0 = 0;
LegoActorInfo g_actorInfo[66]; LegoActorInfo g_actorInfo[66];
// FUNCTION: LEGO1 0x10082a20 // FUNCTION: LEGO1 0x10082a20
// FUNCTION: BETA10 0x10073c60
LegoCharacterManager::LegoCharacterManager() LegoCharacterManager::LegoCharacterManager()
{ {
m_characters = new LegoCharacterMap(); m_characters = new LegoCharacterMap();
Init(); Init(); // DECOMP: inlined here in BETA10
m_customizeAnimFile = new CustomizeAnimFileVariable("CUSTOMIZE_ANIM_FILE"); m_customizeAnimFile = new CustomizeAnimFileVariable("CUSTOMIZE_ANIM_FILE");
VariableTable()->SetVariable(m_customizeAnimFile); VariableTable()->SetVariable(m_customizeAnimFile);
@ -228,8 +230,9 @@ const char* LegoCharacterManager::GetActorName(MxS32 p_index)
if (p_index < sizeOfArray(g_actorInfo)) { if (p_index < sizeOfArray(g_actorInfo)) {
return g_actorInfo[p_index].m_name; return g_actorInfo[p_index].m_name;
} }
else {
return NULL; return NULL;
}
} }
// FUNCTION: LEGO1 0x100834f0 // FUNCTION: LEGO1 0x100834f0
@ -244,9 +247,9 @@ MxU32 LegoCharacterManager::GetNumActors()
LegoROI* LegoCharacterManager::GetActorROI(const char* p_name, MxBool p_createEntity) LegoROI* LegoCharacterManager::GetActorROI(const char* p_name, MxBool p_createEntity)
{ {
LegoCharacter* character = NULL; LegoCharacter* character = NULL;
LegoCharacterMap::iterator it = m_characters->find(const_cast<char*>(p_name)); LegoCharacterMap::const_iterator it = m_characters->find(const_cast<char*>(p_name));
if (it != m_characters->end()) { if (!(it == m_characters->end())) {
character = (*it).second; character = (*it).second;
character->AddRef(); character->AddRef();
} }
@ -254,13 +257,9 @@ LegoROI* LegoCharacterManager::GetActorROI(const char* p_name, MxBool p_createEn
if (character == NULL) { if (character == NULL) {
LegoROI* roi = CreateActorROI(p_name); LegoROI* roi = CreateActorROI(p_name);
if (roi == NULL) {
goto done;
}
roi->SetVisibility(FALSE);
if (roi != NULL) { if (roi != NULL) {
roi->SetVisibility(FALSE);
character = new LegoCharacter(roi); character = new LegoCharacter(roi);
char* name = new char[strlen(p_name) + 1]; char* name = new char[strlen(p_name) + 1];
@ -276,7 +275,6 @@ LegoROI* LegoCharacterManager::GetActorROI(const char* p_name, MxBool p_createEn
VideoManager()->Get3DManager()->Add(*character->m_roi); VideoManager()->Get3DManager()->Add(*character->m_roi);
} }
done:
if (character != NULL) { if (character != NULL) {
if (p_createEntity && character->m_roi->GetEntity() == NULL) { if (p_createEntity && character->m_roi->GetEntity() == NULL) {
LegoExtraActor* actor = new LegoExtraActor(); LegoExtraActor* actor = new LegoExtraActor();
@ -289,15 +287,15 @@ LegoROI* LegoCharacterManager::GetActorROI(const char* p_name, MxBool p_createEn
return character->m_roi; return character->m_roi;
} }
else {
return NULL; return NULL;
}
} }
// FUNCTION: LEGO1 0x10083b20 // FUNCTION: LEGO1 0x10083b20
// FUNCTION: BETA10 0x10074608 // FUNCTION: BETA10 0x10074608
MxBool LegoCharacterManager::Exists(const char* p_name) MxBool LegoCharacterManager::Exists(const char* p_name)
{ {
LegoCharacter* character = NULL;
LegoCharacterMap::iterator it = m_characters->find(const_cast<char*>(p_name)); LegoCharacterMap::iterator it = m_characters->find(const_cast<char*>(p_name));
if (it != m_characters->end()) { if (it != m_characters->end()) {
@ -454,6 +452,7 @@ void LegoCharacterManager::RemoveROI(LegoROI* p_roi)
} }
// FUNCTION: LEGO1 0x10084030 // FUNCTION: LEGO1 0x10084030
// FUNCTION: BETA10 0x10074e4f
LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key) LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
{ {
MxBool success = FALSE; MxBool success = FALSE;
@ -601,7 +600,7 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
// FUNCTION: LEGO1 0x100849a0 // FUNCTION: LEGO1 0x100849a0
// FUNCTION: BETA10 0x10075b51 // FUNCTION: BETA10 0x10075b51
MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_textureInfo) MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_texture)
{ {
LegoResult result = SUCCESS; LegoResult result = SUCCESS;
LegoROI* head = FindChildROI(p_roi, g_actorLODs[c_headLOD].m_name); LegoROI* head = FindChildROI(p_roi, g_actorLODs[c_headLOD].m_name);
@ -610,24 +609,30 @@ MxBool LegoCharacterManager::FUN_100849a0(LegoROI* p_roi, LegoTextureInfo* p_tex
char lodName[256]; char lodName[256];
ViewLODList* lodList = GetViewLODListManager()->Lookup(g_actorLODs[c_headLOD].m_parentName); ViewLODList* lodList = GetViewLODListManager()->Lookup(g_actorLODs[c_headLOD].m_parentName);
assert(lodList);
MxS32 lodSize = lodList->Size(); MxS32 lodSize = lodList->Size();
sprintf(lodName, "%s%s%d", p_roi->GetName(), "head", g_unk0x100fc4e8++); sprintf(lodName, "%s%s%d", p_roi->GetName(), "head", g_unk0x100fc4e8++);
ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize); ViewLODList* dupLodList = GetViewLODListManager()->Create(lodName, lodSize);
assert(dupLodList);
Tgl::Renderer* renderer = VideoManager()->GetRenderer(); Tgl::Renderer* renderer = VideoManager()->GetRenderer();
if (p_textureInfo == NULL) { if (p_texture == NULL) {
LegoActorInfo* info = GetActorInfo(p_roi->GetName()); LegoActorInfo* info = GetActorInfo(p_roi->GetName());
assert(info);
LegoActorInfo::Part& part = info->m_parts[c_headPart]; LegoActorInfo::Part& part = info->m_parts[c_headPart];
p_textureInfo = TextureContainer()->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]); p_texture = TextureContainer()->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]);
assert(p_texture);
} }
for (MxS32 i = 0; i < lodSize; i++) { for (MxS32 i = 0; i < lodSize; i++) {
LegoLOD* lod = (LegoLOD*) (*lodList)[i]; LegoLOD* lod = (LegoLOD*) (*lodList)[i];
LegoLOD* clone = lod->Clone(renderer); LegoLOD* clone = lod->Clone(renderer);
if (p_textureInfo != NULL) { if (p_texture != NULL) {
clone->FUN_100aad70(p_textureInfo); clone->FUN_100aad70(p_texture);
} }
dupLodList->PushBack(clone); dupLodList->PushBack(clone);
@ -672,6 +677,7 @@ LegoExtraActor* LegoCharacterManager::GetExtraActor(const char* p_name)
} }
// FUNCTION: LEGO1 0x10084c60 // FUNCTION: LEGO1 0x10084c60
// FUNCTION: BETA10 0x10075ede
LegoActorInfo* LegoCharacterManager::GetActorInfo(const char* p_name) LegoActorInfo* LegoCharacterManager::GetActorInfo(const char* p_name)
{ {
MxU32 i; MxU32 i;
@ -685,11 +691,13 @@ LegoActorInfo* LegoCharacterManager::GetActorInfo(const char* p_name)
if (i < sizeOfArray(g_actorInfo)) { if (i < sizeOfArray(g_actorInfo)) {
return &g_actorInfo[i]; return &g_actorInfo[i];
} }
else {
return NULL; return NULL;
}
} }
// FUNCTION: LEGO1 0x10084cb0 // FUNCTION: LEGO1 0x10084cb0
// FUNCTION: BETA10 0x10075f66
LegoActorInfo* LegoCharacterManager::GetActorInfo(LegoROI* p_roi) LegoActorInfo* LegoCharacterManager::GetActorInfo(LegoROI* p_roi)
{ {
MxU32 i; MxU32 i;
@ -703,21 +711,24 @@ LegoActorInfo* LegoCharacterManager::GetActorInfo(LegoROI* p_roi)
if (i < sizeOfArray(g_actorInfo)) { if (i < sizeOfArray(g_actorInfo)) {
return &g_actorInfo[i]; return &g_actorInfo[i];
} }
else {
return NULL; return NULL;
}
} }
// FUNCTION: LEGO1 0x10084cf0 // FUNCTION: LEGO1 0x10084cf0
// FUNCTION: BETA10 0x10075fe2 // FUNCTION: BETA10 0x10075fe2
LegoROI* LegoCharacterManager::FindChildROI(LegoROI* p_roi, const char* p_name) LegoROI* LegoCharacterManager::FindChildROI(LegoROI* p_roi, const char* p_name)
{ {
#ifdef COMPAT_MODE
CompoundObject::const_iterator it;
#else
CompoundObject::iterator it;
#endif
const CompoundObject* comp = p_roi->GetComp(); const CompoundObject* comp = p_roi->GetComp();
#ifdef COMPAT_MODE for (it = comp->begin(); it != comp->end(); it++) {
for (CompoundObject::const_iterator it = comp->begin(); !(it == comp->end()); it++) {
#else
for (CompoundObject::iterator it = comp->begin(); !(it == comp->end()); it++) {
#endif
LegoROI* roi = (LegoROI*) *it; LegoROI* roi = (LegoROI*) *it;
if (!strcmpi(p_name, roi->GetName())) { if (!strcmpi(p_name, roi->GetName())) {
@ -911,11 +922,13 @@ MxU32 LegoCharacterManager::GetAnimationId(LegoROI* p_roi)
if (info != NULL) { if (info != NULL) {
return info->m_move + g_characterAnimationId; return info->m_move + g_characterAnimationId;
} }
else {
return 0; return 0;
}
} }
// FUNCTION: LEGO1 0x10085140 // FUNCTION: LEGO1 0x10085140
// FUNCTION: BETA10 0x10076855
MxU32 LegoCharacterManager::GetSoundId(LegoROI* p_roi, MxBool p_und) MxU32 LegoCharacterManager::GetSoundId(LegoROI* p_roi, MxBool p_und)
{ {
LegoActorInfo* info = GetActorInfo(p_roi); LegoActorInfo* info = GetActorInfo(p_roi);
@ -927,8 +940,9 @@ MxU32 LegoCharacterManager::GetSoundId(LegoROI* p_roi, MxBool p_und)
if (info != NULL) { if (info != NULL) {
return info->m_sound + g_unk0x100fc4d8; return info->m_sound + g_unk0x100fc4d8;
} }
else {
return 0; return 0;
}
} }
// FUNCTION: LEGO1 0x10085180 // FUNCTION: LEGO1 0x10085180
@ -940,8 +954,9 @@ MxU8 LegoCharacterManager::GetMood(LegoROI* p_roi)
if (info != NULL) { if (info != NULL) {
return info->m_mood; return info->m_mood;
} }
else {
return 0; return 0;
}
} }
// FUNCTION: LEGO1 0x100851a0 // FUNCTION: LEGO1 0x100851a0

View File

@ -1,5 +1,36 @@
#include "legoobjectfactory.h" #include "legoobjectfactory.h"
// Headers need to be included in a certain order to match the original binary.
// Some of the following headers were probably not directly included,
// but were included from one of the higher level classes. We should attempt
// to reverse engineer the inclusion "graph" at some point. Until then, to maintain
// correct order in the binary, we include them in the order we want here.
// clang-format off
#include "mxpresenter.h"
#include "legoentity.h"
#include "legopathactor.h"
// The below header inclusions should be sound.
#include "legoloopinganimpresenter.h"
#include "mxcompositemediapresenter.h"
#include "legoactorpresenter.h"
#include "legomodelpresenter.h"
#include "legotexturepresenter.h"
#include "legopartpresenter.h"
#include "legoactioncontrolpresenter.h"
#include "lego3dwavepresenter.h"
#include "jetskirace.h"
#include "carrace.h"
#include "score.h"
#include "legoact2.h"
#include "helicopter.h"
#include "act2policestation.h"
#include "act3.h"
#include "doors.h"
#include "pizzeria.h"
#include "buildings.h"
#include "jukebox.h"
// clang-format on
#include "act2actor.h" #include "act2actor.h"
#include "act2brick.h" #include "act2brick.h"
#include "act2genactor.h" #include "act2genactor.h"

View File

@ -145,7 +145,7 @@ MxResult LegoPlantManager::FUN_10026410()
for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) {
Mx4DPointFloat* normal = boundary->GetEdgeNormal(j); Mx4DPointFloat* normal = boundary->GetEdgeNormal(j);
if (position.Dot(normal, &position) + (*normal).index_operator(3) < -0.001) { if (position.Dot(*normal, position) + (*normal).index_operator(3) < -0.001) {
MxTrace( MxTrace(
"Plant %d shot location (%g, %g, %g) is not in boundary %s.\n", "Plant %d shot location (%g, %g, %g) is not in boundary %s.\n",
i, i,
@ -162,8 +162,8 @@ MxResult LegoPlantManager::FUN_10026410()
if (g_plantInfo[i].m_boundary != NULL) { if (g_plantInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_plantInfo[i].m_boundary->GetUnknown0x14(); Mx4DPointFloat& unk0x14 = *g_plantInfo[i].m_boundary->GetUnknown0x14();
if (position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) > 0.001 || if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 ||
position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) < -0.001) { position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) {
g_plantInfo[i].m_y = g_plantInfo[i].m_y =
-((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) + -((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) +

File diff suppressed because it is too large Load Diff

View File

@ -71,7 +71,7 @@ LegoTextureInfo* LegoTextureInfo::Create(const char* p_name, LegoTexture* p_text
desc.ddpfPixelFormat.dwRGBBitCount = 8; desc.ddpfPixelFormat.dwRGBBitCount = 8;
MxS32 i; MxS32 i;
LegoU8* bits; const LegoU8* bits;
MxU8* surface; MxU8* surface;
if (pDirectDraw->CreateSurface(&desc, &textureInfo->m_surface, NULL) != DD_OK) { if (pDirectDraw->CreateSurface(&desc, &textureInfo->m_surface, NULL) != DD_OK) {
@ -186,7 +186,7 @@ BOOL LegoTextureInfo::GetGroupTexture(Tgl::Mesh* pMesh, LegoTextureInfo*& p_text
} }
// FUNCTION: LEGO1 0x10066010 // FUNCTION: LEGO1 0x10066010
LegoResult LegoTextureInfo::FUN_10066010(LegoU8* p_bits) LegoResult LegoTextureInfo::FUN_10066010(const LegoU8* p_bits)
{ {
if (m_surface != NULL && m_texture != NULL) { if (m_surface != NULL && m_texture != NULL) {
DDSURFACEDESC desc; DDSURFACEDESC desc;
@ -195,7 +195,7 @@ LegoResult LegoTextureInfo::FUN_10066010(LegoU8* p_bits)
if (m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) { if (m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) {
MxU8* surface = (MxU8*) desc.lpSurface; MxU8* surface = (MxU8*) desc.lpSurface;
LegoU8* bits = p_bits; const LegoU8* bits = p_bits;
if (desc.dwWidth == desc.lPitch) { if (desc.dwWidth == desc.lPitch) {
memcpy(desc.lpSurface, p_bits, desc.dwWidth * desc.dwHeight); memcpy(desc.lpSurface, p_bits, desc.dwWidth * desc.dwHeight);

View File

@ -381,7 +381,7 @@ void NotifyEntity(const char* p_filename, MxS32 p_entityId, LegoEntity* p_sender
// FUNCTION: LEGO1 0x1003eab0 // FUNCTION: LEGO1 0x1003eab0
void SetCameraControllerFromIsle() void SetCameraControllerFromIsle()
{ {
InputManager()->SetCamera(FindWorld(*g_isleScript, IsleScript::c__Isle)->GetCamera()); InputManager()->SetCamera(FindWorld(*g_isleScript, IsleScript::c__Isle)->GetCameraController());
} }
// FUNCTION: LEGO1 0x1003eae0 // FUNCTION: LEGO1 0x1003eae0
@ -709,7 +709,7 @@ void WriteDefaultTexture(LegoFile* p_file, const char* p_name)
} }
else { else {
MxU8* surface = (MxU8*) desc.lpSurface; MxU8* surface = (MxU8*) desc.lpSurface;
LegoU8* bits = image->GetBits(); const LegoU8* bits = image->GetBits();
for (MxS32 i = 0; i < desc.dwHeight; i++) { for (MxS32 i = 0; i < desc.dwHeight; i++) {
memcpy(surface, bits, desc.dwWidth); memcpy(surface, bits, desc.dwWidth);

View File

@ -54,7 +54,8 @@ MxResult MxTransitionManager::GetDDrawSurfaceFromVideoManager() // vtable+0x14
// FUNCTION: LEGO1 0x1004bac0 // FUNCTION: LEGO1 0x1004bac0
MxResult MxTransitionManager::Tickle() MxResult MxTransitionManager::Tickle()
{ {
if (m_animationSpeed + m_systemTime > timeGetTime()) { MxULong time = m_animationSpeed + m_systemTime;
if (time > timeGetTime()) {
return SUCCESS; return SUCCESS;
} }

View File

@ -127,7 +127,7 @@ void LegoActor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2)
if (p_roi) { if (p_roi) {
const char* name = p_roi->GetName(); const char* name = p_roi->GetName();
for (MxU32 i = 1; i <= sizeOfArray(g_actorNames) - 1; i++) { for (MxU32 i = 1; i <= sizeOfArray(g_actorNames) - 2; i++) {
if (!strcmpi(name, g_actorNames[i])) { if (!strcmpi(name, g_actorNames[i])) {
m_type = e_actor; m_type = e_actor;
m_actorId = i; m_actorId = i;

View File

@ -42,21 +42,21 @@ void LegoEntity::ResetWorldTransform(MxBool p_cameraFlag)
{ {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
if (world != NULL && world->GetCamera() != NULL) { if (world != NULL && world->GetCameraController() != NULL) {
m_cameraFlag = p_cameraFlag; m_cameraFlag = p_cameraFlag;
if (m_cameraFlag) { if (m_cameraFlag) {
world->GetCamera()->SetEntity(this); world->GetCameraController()->SetEntity(this);
world->GetCamera()->SetWorldTransform( world->GetCameraController()->SetWorldTransform(
Mx3DPointFloat(0.0F, 1.25F, 0.0F), Mx3DPointFloat(0.0F, 1.25F, 0.0F),
Mx3DPointFloat(0.0F, 0.0F, 1.0F), Mx3DPointFloat(0.0F, 0.0F, 1.0F),
Mx3DPointFloat(0.0F, 1.0F, 0.0F) Mx3DPointFloat(0.0F, 1.0F, 0.0F)
); );
} }
else { else {
if (world->GetCamera()->GetEntity() == this) { if (world->GetCameraController()->GetEntity() == this) {
world->GetCamera()->SetEntity(NULL); world->GetCameraController()->SetEntity(NULL);
world->GetCamera()->SetWorldTransform( world->GetCameraController()->SetWorldTransform(
Mx3DPointFloat(0.0F, 0.0F, 0.0F), Mx3DPointFloat(0.0F, 0.0F, 0.0F),
Mx3DPointFloat(0.0F, 0.0F, 1.0F), Mx3DPointFloat(0.0F, 0.0F, 1.0F),
Mx3DPointFloat(0.0F, 1.0F, 0.0F) Mx3DPointFloat(0.0F, 1.0F, 0.0F)
@ -72,10 +72,10 @@ void LegoEntity::SetWorldTransform(const Vector3& p_location, const Vector3& p_d
{ {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
if (world != NULL && world->GetCamera() != NULL) { if (world != NULL && world->GetCameraController() != NULL) {
m_cameraFlag = TRUE; m_cameraFlag = TRUE;
world->GetCamera()->SetEntity(this); world->GetCameraController()->SetEntity(this);
world->GetCamera()->SetWorldTransform(p_location, p_direction, p_up); world->GetCameraController()->SetWorldTransform(p_location, p_direction, p_up);
} }
} }
@ -193,8 +193,8 @@ void LegoEntity::FUN_10010c30()
{ {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
if (m_cameraFlag && world && world->GetCamera() && m_roi) { if (m_cameraFlag && world && world->GetCameraController() && m_roi) {
world->GetCamera()->FUN_100123e0(m_roi->GetLocal2World(), 1); world->GetCameraController()->FUN_100123e0(m_roi->GetLocal2World(), 1);
} }
} }

View File

@ -90,7 +90,7 @@ MxS32 LegoJetskiRaceActor::VTable0x1c(LegoPathBoundary* p_boundary, LegoEdge* p_
LERP3(a, *v1, *v2, m_unk0xe4); LERP3(a, *v1, *v2, m_unk0xe4);
m_destEdge->FUN_1002ddc0(*m_boundary, bbb); m_destEdge->FUN_1002ddc0(*m_boundary, bbb);
c.EqualsCross(&bbb, m_boundary->GetUnknown0x14()); c.EqualsCross(bbb, *m_boundary->GetUnknown0x14());
c.Unitize(); c.Unitize();
Mx3DPointFloat worldDirection(m_roi->GetWorldDirection()); Mx3DPointFloat worldDirection(m_roi->GetWorldDirection());

File diff suppressed because it is too large Load Diff

View File

@ -30,6 +30,11 @@
DECOMP_SIZE_ASSERT(LegoNavController, 0x70) DECOMP_SIZE_ASSERT(LegoNavController, 0x70)
// MSVC 4.20 didn't define a macro for this key
#ifndef VK_OEM_MINUS
#define VK_OEM_MINUS 0xBD
#endif
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
#ifndef M_PI #ifndef M_PI
@ -109,7 +114,7 @@ char g_debugPassword[] = "OGEL";
char* g_currentInput = g_debugPassword; char* g_currentInput = g_debugPassword;
// GLOBAL: LEGO1 0x100f66cc // GLOBAL: LEGO1 0x100f66cc
MxS32 g_unk0x100f66cc = -1; MxS32 g_nextCharacter = -1;
// GLOBAL: LEGO1 0x100f66d0 // GLOBAL: LEGO1 0x100f66d0
MxBool g_enableMusic = TRUE; MxBool g_enableMusic = TRUE;
@ -542,8 +547,8 @@ MxResult LegoNavController::ProcessJoystickInput(MxBool& p_und)
if (povPosition >= 0) { if (povPosition >= 0) {
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
if (world && world->GetCamera()) { if (world && world->GetCameraController()) {
world->GetCamera()->FUN_10012320(DTOR(povPosition)); world->GetCameraController()->FUN_10012320(DTOR(povPosition));
p_und = TRUE; p_und = TRUE;
} }
} }
@ -582,29 +587,33 @@ MxResult LegoNavController::ProcessKeyboardInput()
m_unk0x6c = TRUE; m_unk0x6c = TRUE;
MxS32 hMax; MxS32 hMax;
if ((keyFlags & LegoInputManager::c_leftOrRight) == LegoInputManager::c_left) { switch (keyFlags & LegoInputManager::c_leftOrRight) {
case LegoInputManager::c_left:
hMax = 0; hMax = 0;
} break;
else if ((keyFlags & LegoInputManager::c_leftOrRight) == LegoInputManager::c_right) { case LegoInputManager::c_right:
hMax = m_hMax; hMax = m_hMax;
} break;
else { default:
m_targetRotationalVel = 0.0; m_targetRotationalVel = 0.0;
m_rotationalAccel = m_maxRotationalDeccel; m_rotationalAccel = m_maxRotationalDeccel;
bool1 = TRUE; bool1 = TRUE;
break;
} }
MxS32 vMax; MxS32 vMax;
if ((keyFlags & LegoInputManager::c_upOrDown) == LegoInputManager::c_up) { switch (keyFlags & LegoInputManager::c_upOrDown) {
case LegoInputManager::c_up:
vMax = 0; vMax = 0;
} break;
else if ((keyFlags & LegoInputManager::c_upOrDown) == LegoInputManager::c_down) { case LegoInputManager::c_down:
vMax = m_vMax; vMax = m_vMax;
} break;
else { default:
m_targetLinearVel = 0.0; m_targetLinearVel = 0.0;
m_linearAccel = m_maxLinearDeccel; m_linearAccel = m_maxLinearDeccel;
bool2 = TRUE; bool2 = TRUE;
break;
} }
MxFloat val = keyFlags & LegoInputManager::c_bit5 ? 1.0f : 4.0f; MxFloat val = keyFlags & LegoInputManager::c_bit5 ? 1.0f : 4.0f;
@ -693,29 +702,29 @@ MxLong LegoNavController::Notify(MxParam& p_param)
} }
break; break;
} }
case 'k': case VK_ADD:
case 'm': { // Keys need to be uppercased to trigger this code, but seems dysfunctional case VK_SUBTRACT: { // Cycles through characters and puts them in front of you
if (g_unk0x100f66cc == -1) { if (g_nextCharacter == -1) {
g_unk0x100f66cc = 0; g_nextCharacter = 0;
} }
else { else {
CharacterManager()->ReleaseActor(CharacterManager()->GetActorName(g_unk0x100f66cc)); CharacterManager()->ReleaseActor(CharacterManager()->GetActorName(g_nextCharacter));
if (key == 'k') { if (key == VK_ADD) {
g_unk0x100f66cc++; g_nextCharacter++;
if (g_unk0x100f66cc >= CharacterManager()->GetNumActors()) { if (g_nextCharacter >= CharacterManager()->GetNumActors()) {
g_unk0x100f66cc = 0; g_nextCharacter = 0;
} }
} }
else { else {
g_unk0x100f66cc--; g_nextCharacter--;
if (g_unk0x100f66cc < 0) { if (g_nextCharacter < 0) {
g_unk0x100f66cc = CharacterManager()->GetNumActors() - 1; g_nextCharacter = CharacterManager()->GetNumActors() - 1;
} }
} }
} }
LegoROI* roi = CharacterManager()->GetActorROI(CharacterManager()->GetActorName(g_unk0x100f66cc), TRUE); LegoROI* roi = CharacterManager()->GetActorROI(CharacterManager()->GetActorName(g_nextCharacter), TRUE);
if (roi != NULL) { if (roi != NULL) {
MxMatrix mat; MxMatrix mat;
ViewROI* viewRoi = LegoOmni::GetInstance()->GetVideoManager()->GetViewROI(); ViewROI* viewRoi = LegoOmni::GetInstance()->GetVideoManager()->GetViewROI();
@ -728,7 +737,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
} }
break; break;
} }
case '{': { // Saves the game. Can't actually be triggered case VK_F12: { // Saves the game
InfocenterState* state = (InfocenterState*) GameState()->GetState("InfocenterState"); InfocenterState* state = (InfocenterState*) GameState()->GetState("InfocenterState");
if (state && state->HasRegistered()) { if (state && state->HasRegistered()) {
GameState()->Save(0); GameState()->Save(0);
@ -994,7 +1003,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
case 'X': case 'X':
RealtimeView::SetUserMaxLOD(3.6); RealtimeView::SetUserMaxLOD(3.6);
break; break;
case 'j': { case VK_MULTIPLY: {
MxU8 newActor = GameState()->GetActorId() + 1; MxU8 newActor = GameState()->GetActorId() + 1;
if (newActor > LegoActor::c_laura) { if (newActor > LegoActor::c_laura) {
@ -1004,10 +1013,10 @@ MxLong LegoNavController::Notify(MxParam& p_param)
GameState()->SetActorId(newActor); GameState()->SetActorId(newActor);
break; break;
} }
case 'o': case VK_DIVIDE:
GameState()->SetActorId(LegoActor::c_brickster); GameState()->SetActorId(LegoActor::c_brickster);
break; break;
case 'z': case VK_F11:
if (GameState()->m_isDirty) { if (GameState()->m_isDirty) {
GameState()->m_isDirty = FALSE; GameState()->m_isDirty = FALSE;
} }
@ -1015,7 +1024,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
GameState()->m_isDirty = TRUE; GameState()->m_isDirty = TRUE;
} }
break; break;
case 0xbd: case VK_OEM_MINUS:
g_unk0x100f66bc = LegoAnimationManager::e_unk1; g_unk0x100f66bc = LegoAnimationManager::e_unk1;
break; break;
} }

View File

@ -554,15 +554,15 @@ MxCore* LegoWorld::Find(const char* p_class, const char* p_name)
MxPresenter* presenter; MxPresenter* presenter;
while (cursor.Next(presenter)) { while (cursor.Next(presenter)) {
MxDSAction* action = presenter->GetAction(); if (!strcmp(presenter->GetAction()->GetObjectName(), p_name)) {
if (!strcmp(action->GetObjectName(), p_name)) {
return presenter; return presenter;
} }
} }
return NULL; return NULL;
} }
else if (!strcmp(p_class, "MxEntity")) {
if (!strcmp(p_class, "MxEntity")) {
LegoEntityListCursor cursor(m_entityList); LegoEntityListCursor cursor(m_entityList);
LegoEntity* entity; LegoEntity* entity;
@ -579,7 +579,8 @@ MxCore* LegoWorld::Find(const char* p_class, const char* p_name)
return NULL; return NULL;
} }
else if (!strcmp(p_class, "LegoAnimPresenter")) {
if (!strcmp(p_class, "LegoAnimPresenter")) {
MxPresenterListCursor cursor(&m_animPresenters); MxPresenterListCursor cursor(&m_animPresenters);
MxPresenter* presenter; MxPresenter* presenter;
@ -591,20 +592,18 @@ MxCore* LegoWorld::Find(const char* p_class, const char* p_name)
return NULL; return NULL;
} }
else {
for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) {
if ((*it)->IsA(p_class) && (*it)->IsA("MxPresenter")) {
MxPresenter* presenter = (MxPresenter*) *it;
MxDSAction* action = presenter->GetAction();
if (!strcmp(action->GetObjectName(), p_name)) { for (MxCoreSet::iterator i = m_set0xa8.begin(); i != m_set0xa8.end(); i++) {
return *it; if ((*i)->IsA(p_class) && (*i)->IsA("MxPresenter")) {
} assert(((MxPresenter*) (*i))->GetAction());
if (!strcmp(((MxPresenter*) (*i))->GetAction()->GetObjectName(), p_name)) {
return *i;
} }
} }
return NULL;
} }
return NULL;
} }
// FUNCTION: LEGO1 0x10021790 // FUNCTION: LEGO1 0x10021790
@ -783,7 +782,7 @@ MxResult LegoWorld::Tickle()
ReadyWorld(); ReadyWorld();
return TRUE; return TRUE;
case e_two: case e_two:
if (PresentersPending()) { if (PresentersPending() == TRUE) {
break; break;
} }
default: default:

View File

@ -466,7 +466,7 @@ MxBool LegoInputManager::ProcessOneEvent(LegoEventNotificationParam& p_param)
LegoROI* roi = PickROI(p_param.GetX(), p_param.GetY()); LegoROI* roi = PickROI(p_param.GetX(), p_param.GetY());
p_param.SetROI(roi); p_param.SetROI(roi);
if (roi && roi->GetVisibility()) { if (roi && roi->GetVisibility() == TRUE) {
for (OrientableROI* parent = roi->GetParentROI(); parent; parent = parent->GetParentROI()) { for (OrientableROI* parent = roi->GetParentROI(); parent; parent = parent->GetParentROI()) {
roi = (LegoROI*) parent; roi = (LegoROI*) parent;
} }

View File

@ -183,6 +183,7 @@ void LegoAnimActor::ClearMaps()
} }
// FUNCTION: LEGO1 0x1001c870 // FUNCTION: LEGO1 0x1001c870
// FUNCTION: BETA10 0x1003e7e4
void LegoAnimActor::SetWorldSpeed(MxFloat p_worldSpeed) void LegoAnimActor::SetWorldSpeed(MxFloat p_worldSpeed)
{ {
if (p_worldSpeed < 0) { if (p_worldSpeed < 0) {

View File

@ -138,7 +138,7 @@ MxResult LegoExtraActor::FUN_1002aae0()
Vector3 positionRef(m_unk0xec[3]); Vector3 positionRef(m_unk0xec[3]);
dirRef *= -1.0f; dirRef *= -1.0f;
rightRef.EqualsCross(&upRef, &dirRef); rightRef.EqualsCross(upRef, dirRef);
if (m_boundary == m_destEdge->m_faceA) { if (m_boundary == m_destEdge->m_faceA) {
m_boundary = (LegoPathBoundary*) m_destEdge->m_faceB; m_boundary = (LegoPathBoundary*) m_destEdge->m_faceB;
@ -191,9 +191,10 @@ inline void LegoExtraActor::FUN_1002ad8a()
} }
// FUNCTION: LEGO1 0x1002aba0 // FUNCTION: LEGO1 0x1002aba0
// FUNCTION: BETA10 0x1008114a
MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool) MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
{ {
if (p_actor->GetActorState() != c_initial || m_actorState != c_initial) { if (p_actor->GetActorState() != c_initial || GetActorState() != c_initial) {
return FAILURE; return FAILURE;
} }
@ -222,7 +223,7 @@ MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
for (MxS32 i = 0; i < m_boundary->GetNumEdges(); i++) { for (MxS32 i = 0; i < m_boundary->GetNumEdges(); i++) {
Mx4DPointFloat* normal = m_boundary->GetEdgeNormal(i); Mx4DPointFloat* normal = m_boundary->GetEdgeNormal(i);
if (positionRef.Dot(normal, &positionRef) + (*normal)[3] < -0.001) { if (positionRef.Dot(*normal, positionRef) + normal->index_operator(3) < -0.001) {
b = TRUE; b = TRUE;
break; break;
} }
@ -232,41 +233,34 @@ MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
m_roi->FUN_100a58f0(matrix2); m_roi->FUN_100a58f0(matrix2);
m_roi->VTable0x14(); m_roi->VTable0x14();
FUN_1002ad8a(); FUN_1002ad8a();
assert(m_roi);
assert(SoundManager()->GetCacheSoundManager());
SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE); SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE);
m_scheduledTime = Timer()->GetTime() + m_disAnim->GetDuration(); m_scheduledTime = Timer()->GetTime() + m_disAnim->GetDuration();
m_prevWorldSpeed = m_worldSpeed; m_prevWorldSpeed = GetWorldSpeed();
VTable0xc4(); VTable0xc4();
SetWorldSpeed(0); SetWorldSpeed(0);
m_whichAnim = 1; m_whichAnim = 1;
m_actorState = c_one | c_noCollide; SetActorState(c_one | c_noCollide);
} }
} }
if (b) { if (b) {
LegoROI* roi = m_roi; LegoROI* roi = GetROI();
assert(roi);
SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE); SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE);
VTable0xc4(); VTable0xc4();
m_actorState = c_two | c_noCollide; SetActorState(c_two | c_noCollide);
Mx3DPointFloat dir = p_actor->GetWorldDirection(); Mx3DPointFloat dir = p_actor->GetWorldDirection();
MxMatrix matrix3 = MxMatrix(roi->GetLocal2World()); MxMatrix matrix3 = MxMatrix(roi->GetLocal2World());
Vector3 positionRef(matrix3[3]); Vector3 positionRef(matrix3[3]);
positionRef += g_unk0x10104c18; positionRef += g_unk0x10104c18;
roi->FUN_100a58f0(matrix3); roi->FUN_100a58f0(matrix3);
#ifdef COMPAT_MODE float dotX = dir.Dot(dir, Mx3DPointFloat(1.0f, 0, 0));
float dotX, dotZ; float dotZ = dir.Dot(dir, Mx3DPointFloat(0, 0, 1.0f));
{
Mx3DPointFloat tmp(1.0f, 0, 0);
dotX = dir.Dot(&dir, &tmp);
Mx3DPointFloat tmp2(0, 0, 1.0f);
dotZ = dir.Dot(&dir, &tmp2);
}
#else
float dotX = dir.Dot(&dir, &Mx3DPointFloat(1.0f, 0, 0));
float dotZ = dir.Dot(&dir, &Mx3DPointFloat(0, 0, 1.0f));
#endif
if (abs(dotZ) < abs(dotX)) { if (fabs(dotZ) < fabs(dotX)) {
m_axis = dotX > 0.0 ? e_posz : e_negz; m_axis = dotX > 0.0 ? e_posz : e_negz;
} }
else { else {
@ -463,9 +457,9 @@ MxU32 LegoExtraActor::VTable0x6c(
Mx3DPointFloat local54(p_v1); Mx3DPointFloat local54(p_v1);
local54 -= local60; local54 -= local60;
float local1c = p_v2.Dot(&p_v2, &p_v2); float local1c = p_v2.Dot(p_v2, p_v2);
float local24 = p_v2.Dot(&p_v2, &local54) * 2.0f; float local24 = p_v2.Dot(p_v2, local54) * 2.0f;
float local20 = local54.Dot(&local54, &local54); float local20 = local54.Dot(local54, local54);
if (m_unk0x15 != 0 && local20 < 10.0f) { if (m_unk0x15 != 0 && local20 < 10.0f) {
return 0; return 0;

View File

@ -16,6 +16,7 @@
#include "mxutilities.h" #include "mxutilities.h"
#include "mxvariabletable.h" #include "mxvariabletable.h"
#include <mxdebug.h>
#include <vec.h> #include <vec.h>
DECOMP_SIZE_ASSERT(LegoPathActor, 0x154) DECOMP_SIZE_ASSERT(LegoPathActor, 0x154)
@ -142,11 +143,11 @@ MxResult LegoPathActor::VTable0x88(
dir *= -1.0f; dir *= -1.0f;
} }
right.EqualsCross(&up, &dir); right.EqualsCross(up, dir);
m_roi->UpdateTransformationRelativeToParent(matrix); m_roi->UpdateTransformationRelativeToParent(matrix);
if (!m_cameraFlag || !m_userNavFlag) { if (!m_cameraFlag || !m_userNavFlag) {
p5.EqualsCross(p_boundary->GetUnknown0x14(), &p3); p5.EqualsCross(*p_boundary->GetUnknown0x14(), p3);
p5.Unitize(); p5.Unitize();
if (VTable0x80(p1, p4, p2, p5) == SUCCESS) { if (VTable0x80(p1, p4, p2, p5) == SUCCESS) {
@ -208,11 +209,11 @@ MxResult LegoPathActor::VTable0x84(
dir *= -1.0f; dir *= -1.0f;
} }
right.EqualsCross(&up, &dir); right.EqualsCross(up, dir);
m_roi->UpdateTransformationRelativeToParent(matrix); m_roi->UpdateTransformationRelativeToParent(matrix);
if (!m_cameraFlag || !m_userNavFlag) { if (!m_cameraFlag || !m_userNavFlag) {
p5.EqualsCross(p_boundary->GetUnknown0x14(), &p3); p5.EqualsCross(*p_boundary->GetUnknown0x14(), p3);
p5.Unitize(); p5.Unitize();
if (VTable0x80(p_p1, p_p4, p2, p5) == SUCCESS) { if (VTable0x80(p_p1, p_p4, p2, p5) == SUCCESS) {
@ -233,7 +234,7 @@ MxResult LegoPathActor::VTable0x84(
// FUNCTION: LEGO1 0x1002e100 // FUNCTION: LEGO1 0x1002e100
// FUNCTION: BETA10 0x100b0520 // FUNCTION: BETA10 0x100b0520
MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform) MxS32 LegoPathActor::VTable0x8c(float p_time, MxMatrix& p_transform)
{ {
if (m_userNavFlag && m_actorState == c_initial) { if (m_userNavFlag && m_actorState == c_initial) {
m_lastTime = p_time; m_lastTime = p_time;
@ -243,22 +244,27 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
p4 = Vector3(m_roi->GetWorldPosition()); p4 = Vector3(m_roi->GetWorldPosition());
LegoNavController* nav = NavController(); LegoNavController* nav = NavController();
assert(nav);
m_worldSpeed = nav->GetLinearVel(); m_worldSpeed = nav->GetLinearVel();
if (nav->CalculateNewPosDir(p4, p5, p2, p1, m_boundary->GetUnknown0x14())) { if (nav->CalculateNewPosDir(p4, p5, p2, p1, m_boundary->GetUnknown0x14())) {
Mx3DPointFloat p6; Mx3DPointFloat p6;
p6 = p2; p6 = p2;
MxS32 result = 0;
m_unk0xe9 = m_boundary->Intersect(m_roi->GetWorldBoundingSphere().Radius(), p4, p2, p3, m_destEdge); m_unk0xe9 = m_boundary->Intersect(m_roi->GetWorldBoundingSphere().Radius(), p4, p2, p3, m_destEdge);
if (m_unk0xe9 == -1) { if (m_unk0xe9 == -1) {
MxTrace("Intersect returned -1\n");
return -1; return -1;
} }
else {
if (m_unk0xe9 != 0) { if (m_unk0xe9 != 0) {
p2 = p3; p2 = p3;
}
} }
MxS32 result = VTable0x68(p4, p2, p3); result = VTable0x68(p4, p2, p3);
if (result > 0) { if (result > 0) {
p2 = p4; p2 = p4;
@ -308,12 +314,18 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
dir = p1; dir = p1;
up = *m_boundary->GetUnknown0x14(); up = *m_boundary->GetUnknown0x14();
right.EqualsCross(&up, &dir); right.EqualsCross(up, dir);
right.Unitize();
dir.EqualsCross(&right, &up); MxS32 res = right.Unitize();
assert(res == 0);
dir.EqualsCross(right, up);
pos = p2; pos = p2;
return result; return result;
} }
else {
return -1;
}
} }
else if (p_time >= 0 && m_worldSpeed > 0) { else if (p_time >= 0 && m_worldSpeed > 0) {
float f = (m_BADuration - m_unk0x7c) / m_worldSpeed + m_lastTime; float f = (m_BADuration - m_unk0x7c) / m_worldSpeed + m_lastTime;
@ -332,13 +344,16 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
m_lastTime = f; m_lastTime = f;
p_transform.SetIdentity(); p_transform.SetIdentity();
LegoResult r;
if (m_userNavFlag) { if (m_userNavFlag) {
m_unk0x8c.FUN_1009a1e0(m_unk0x7c / m_BADuration, p_transform, *m_boundary->GetUnknown0x14(), 0); r = m_unk0x8c.FUN_1009a1e0(m_unk0x7c / m_BADuration, p_transform, *m_boundary->GetUnknown0x14(), 0);
} }
else { else {
m_unk0x8c.FUN_1009a1e0(m_unk0x7c / m_BADuration, p_transform, *m_boundary->GetUnknown0x14(), 1); r = m_unk0x8c.FUN_1009a1e0(m_unk0x7c / m_BADuration, p_transform, *m_boundary->GetUnknown0x14(), 1);
} }
assert(r == 0); // SUCCESS
Vector3 pos1(p_transform[3]); Vector3 pos1(p_transform[3]);
Vector3 pos2(m_unk0xec[3]); Vector3 pos2(m_unk0xec[3]);
Mx3DPointFloat p1; Mx3DPointFloat p1;
@ -350,16 +365,17 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
else { else {
m_boundary->FUN_100575b0(pos2, pos1, this); m_boundary->FUN_100575b0(pos2, pos1, this);
pos2 = pos1; pos2 = pos1;
}
if (m_unk0xe9 != 0) { if (m_unk0xe9 != 0) {
VTable0x9c(); VTable0x9c();
}
return 0;
} }
} }
else {
return -1;
}
return -1; return 0;
} }
// FUNCTION: LEGO1 0x1002e740 // FUNCTION: LEGO1 0x1002e740
@ -414,7 +430,7 @@ void LegoPathActor::Animate(float p_time)
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();
if (world) { if (world) {
world->GetCamera()->FUN_10012290(DTOR(m_unk0x14c)); world->GetCameraController()->FUN_10012290(DTOR(m_unk0x14c));
} }
} }
} }
@ -636,7 +652,7 @@ MxResult LegoPathActor::VTable0x9c()
LERP3(local34, v1, v2, m_unk0xe4); LERP3(local34, v1, v2, m_unk0xe4);
m_destEdge->FUN_1002ddc0(*m_boundary, local78); m_destEdge->FUN_1002ddc0(*m_boundary, local78);
local48.EqualsCross(m_boundary->GetUnknown0x14(), &local78); local48.EqualsCross(*m_boundary->GetUnknown0x14(), local78);
local48.Unitize(); local48.Unitize();
} }
@ -646,10 +662,10 @@ MxResult LegoPathActor::VTable0x9c()
upRef = *m_boundary->GetUnknown0x14(); upRef = *m_boundary->GetUnknown0x14();
rightRef.EqualsCross(&upRef, &dirRef); rightRef.EqualsCross(upRef, dirRef);
rightRef.Unitize(); rightRef.Unitize();
dirRef.EqualsCross(&rightRef, &upRef); dirRef.EqualsCross(rightRef, upRef);
dirRef.Unitize(); dirRef.Unitize();
Mx3DPointFloat localc0(m_unk0xec[3]); Mx3DPointFloat localc0(m_unk0xec[3]);

View File

@ -54,11 +54,11 @@ void LegoPathBoundary::FUN_100575b0(Vector3& p_point1, Vector3& p_point2, LegoPa
v = p_point1; v = p_point1;
v -= *ccwV; v -= *ccwV;
float dot1 = v.Dot(&v, m_unk0x50); float dot1 = v.Dot(v, *m_unk0x50);
v = p_point2; v = p_point2;
v -= *ccwV; v -= *ccwV;
float dot2 = v.Dot(&v, m_unk0x50); float dot2 = v.Dot(v, *m_unk0x50);
if (dot2 > dot1) { if (dot2 > dot1) {
for (MxS32 i = 0; i < m_numTriggers; i++) { for (MxS32 i = 0; i < m_numTriggers; i++) {
@ -197,7 +197,7 @@ MxU32 LegoPathBoundary::Intersect(
for (MxS32 i = 0; i < m_numEdges; i++) { for (MxS32 i = 0; i < m_numEdges; i++) {
LegoUnknown100db7f4* edge = (LegoUnknown100db7f4*) m_edges[i]; LegoUnknown100db7f4* edge = (LegoUnknown100db7f4*) m_edges[i];
if (p_point2.Dot(&m_edgeNormals[i], &p_point2) + m_edgeNormals[i][3] <= -1e-07) { if (p_point2.Dot(m_edgeNormals[i], p_point2) + m_edgeNormals[i][3] <= -1e-07) {
if (local10 == 0) { if (local10 == 0) {
local10 = 1; local10 = 1;
vec = p_point2; vec = p_point2;
@ -212,9 +212,9 @@ MxU32 LegoPathBoundary::Intersect(
vec /= len; vec /= len;
} }
float dot = vec.Dot(&vec, &m_edgeNormals[i]); float dot = vec.Dot(vec, m_edgeNormals[i]);
if (dot != 0.0f) { if (dot != 0.0f) {
float local34 = (-m_edgeNormals[i][3] - p_point1.Dot(&p_point1, &m_edgeNormals[i])) / dot; float local34 = (-m_edgeNormals[i][3] - p_point1.Dot(p_point1, m_edgeNormals[i])) / dot;
if (local34 >= -0.001 && local34 <= len && (e == NULL || local34 < localc)) { if (local34 >= -0.001 && local34 <= len && (e == NULL || local34 < localc)) {
e = edge; e = edge;
@ -242,7 +242,7 @@ MxU32 LegoPathBoundary::Intersect(
e->FUN_1002ddc0(*this, local70); e->FUN_1002ddc0(*this, local70);
float local58 = local50.Dot(&local50, &local70); float local58 = local50.Dot(local50, local70);
LegoUnknown100db7f4* local54 = NULL; LegoUnknown100db7f4* local54 = NULL;
if (local58 < 0.0f) { if (local58 < 0.0f) {
@ -252,7 +252,7 @@ MxU32 LegoPathBoundary::Intersect(
local88 = (LegoUnknown100db7f4*) local88->GetClockwiseEdge(*this)) { local88 = (LegoUnknown100db7f4*) local88->GetClockwiseEdge(*this)) {
local88->FUN_1002ddc0(*this, local84); local88->FUN_1002ddc0(*this, local84);
if (local84.Dot(&local84, &local70) <= 0.9) { if (local84.Dot(local84, local70) <= 0.9) {
break; break;
} }
@ -260,7 +260,7 @@ MxU32 LegoPathBoundary::Intersect(
Mx3DPointFloat locala4(p_point3); Mx3DPointFloat locala4(p_point3);
locala4 -= *local90; locala4 -= *local90;
float local8c = locala4.Dot(&locala4, &local84); float local8c = locala4.Dot(locala4, local84);
if (local8c > local58 && local8c < local88->m_unk0x3c) { if (local8c > local58 && local8c < local88->m_unk0x3c) {
local54 = local88; local54 = local88;
@ -279,7 +279,7 @@ MxU32 LegoPathBoundary::Intersect(
locala8 = (LegoUnknown100db7f4*) locala8->GetCounterclockwiseEdge(*this)) { locala8 = (LegoUnknown100db7f4*) locala8->GetCounterclockwiseEdge(*this)) {
locala8->FUN_1002ddc0(*this, localbc); locala8->FUN_1002ddc0(*this, localbc);
if (localbc.Dot(&localbc, &local70) <= 0.9) { if (localbc.Dot(localbc, local70) <= 0.9) {
break; break;
} }
@ -287,7 +287,7 @@ MxU32 LegoPathBoundary::Intersect(
Mx3DPointFloat locald8(p_point3); Mx3DPointFloat locald8(p_point3);
locald8 -= *localc4; locald8 -= *localc4;
float localc0 = locald8.Dot(&locald8, &localbc); float localc0 = locald8.Dot(locald8, localbc);
if (localc0 < local58 && localc0 >= 0.0f) { if (localc0 < local58 && localc0 >= 0.0f) {
local54 = locala8; local54 = locala8;

View File

@ -256,7 +256,7 @@ MxResult LegoPathController::PlaceActor(
for (j = 0; j < b.GetNumEdges(); j++) { for (j = 0; j < b.GetNumEdges(); j++) {
Mx4DPointFloat normal(*b.GetEdgeNormal(j)); Mx4DPointFloat normal(*b.GetEdgeNormal(j));
if (p_position.Dot(&p_position, &normal) + normal[3] < 0.0f) { if (p_position.Dot(p_position, normal) + normal[3] < 0.0f) {
break; break;
} }
} }
@ -282,7 +282,7 @@ MxResult LegoPathController::PlaceActor(
Mx3DPointFloat vec; Mx3DPointFloat vec;
if (((LegoUnknown100db7f4*) edge->GetClockwiseEdge(*boundary))->FUN_1002ddc0(*boundary, vec) == SUCCESS && if (((LegoUnknown100db7f4*) edge->GetClockwiseEdge(*boundary))->FUN_1002ddc0(*boundary, vec) == SUCCESS &&
vec.Dot(&vec, &p_direction) < 0.0f) { vec.Dot(vec, p_direction) < 0.0f) {
edge = edge =
(LegoUnknown100db7f4*) edge->GetCounterclockwiseEdge(*boundary)->GetCounterclockwiseEdge(*boundary); (LegoUnknown100db7f4*) edge->GetCounterclockwiseEdge(*boundary)->GetCounterclockwiseEdge(*boundary);
} }
@ -949,7 +949,7 @@ MxS32 LegoPathController::FUN_1004a240(
p_v1 *= p_f1; p_v1 *= p_f1;
p_v1 += *p_edge->CWVertex(*p_boundary); p_v1 += *p_edge->CWVertex(*p_boundary);
p_edge->FUN_1002ddc0(*p_boundary, vec); p_edge->FUN_1002ddc0(*p_boundary, vec);
p_v2.EqualsCross(p_boundary->GetUnknown0x14(), &vec); p_v2.EqualsCross(*p_boundary->GetUnknown0x14(), vec);
return 0; return 0;
} }
@ -974,14 +974,14 @@ MxResult LegoPathController::FUN_1004a380(
LegoPathBoundary* b = &m_boundaries[i]; LegoPathBoundary* b = &m_boundaries[i];
Mx4DPointFloat* unk0x14 = b->GetUnknown0x14(); Mx4DPointFloat* unk0x14 = b->GetUnknown0x14();
float local28 = p_param3[0].Dot(&p_param3[0], unk0x14); float local28 = p_param3[0].Dot(p_param3[0], *unk0x14);
if (local28 < 0.001 && local28 > -0.001) { if (local28 < 0.001 && local28 > -0.001) {
continue; continue;
} }
float local2c = p_param3[1].Dot(&p_param3[1], unk0x14); float local2c = p_param3[1].Dot(p_param3[1], *unk0x14);
float local34 = p_param3[2].Dot(&p_param3[2], unk0x14) + unk0x14->index_operator(3); float local34 = p_param3[2].Dot(p_param3[2], *unk0x14) + unk0x14->index_operator(3);
float local3c = local2c * local2c - local34 * local28 * 4.0f; float local3c = local2c * local2c - local34 * local28 * 4.0f;
if (local3c < -0.001) { if (local3c < -0.001) {
@ -1022,7 +1022,7 @@ MxResult LegoPathController::FUN_1004a380(
for (j = b->GetNumEdges() - 1; j >= 0; j--) { for (j = b->GetNumEdges() - 1; j >= 0; j--) {
Mx4DPointFloat* local60 = b->GetEdgeNormal(j); Mx4DPointFloat* local60 = b->GetEdgeNormal(j);
if (local24.Dot(local60, &local24) + local60->index_operator(3) < -0.001) { if (local24.Dot(*local60, local24) + local60->index_operator(3) < -0.001) {
break; break;
} }
} }
@ -1031,7 +1031,7 @@ MxResult LegoPathController::FUN_1004a380(
Mx3DPointFloat local74(p_param1); Mx3DPointFloat local74(p_param1);
local74 -= local24; local74 -= local24;
if (local74.Dot(&local74, unk0x14) >= 0.0f) { if (local74.Dot(local74, *unk0x14) >= 0.0f) {
p_param5 = local38; p_param5 = local38;
p_boundary = b; p_boundary = b;
local8 = FALSE; local8 = FALSE;

View File

@ -35,24 +35,6 @@ LegoRace::LegoRace()
NotificationManager()->Register(this); NotificationManager()->Register(this);
} }
// FUNCTION: LEGO1 0x10015b70
MxLong LegoRace::HandlePathStruct(LegoPathStructNotificationParam&)
{
return 0;
}
// FUNCTION: LEGO1 0x10015b80
MxLong LegoRace::HandleEndAction(MxEndActionNotificationParam&)
{
return 0;
}
// FUNCTION: LEGO1 0x10015b90
MxBool LegoRace::Escape()
{
return FALSE;
}
// FUNCTION: LEGO1 0x10015ce0 // FUNCTION: LEGO1 0x10015ce0
// FUNCTION: BETA10 0x100c7a71 // FUNCTION: BETA10 0x100c7a71
MxResult LegoRace::Create(MxDSAction& p_dsAction) MxResult LegoRace::Create(MxDSAction& p_dsAction)
@ -165,6 +147,7 @@ MxResult RaceState::Serialize(LegoFile* p_file)
} }
// FUNCTION: LEGO1 0x10016280 // FUNCTION: LEGO1 0x10016280
// FUNCTION: BETA10 0x100c7dfd
RaceState::Entry* RaceState::GetState(MxU8 p_id) RaceState::Entry* RaceState::GetState(MxU8 p_id)
{ {
for (MxS16 i = 0;; i++) { for (MxS16 i = 0;; i++) {

View File

@ -116,3 +116,10 @@ MxResult LegoRaceActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x10014aa0
// FUNCTION: BETA10 0x100ca038
MxResult LegoRaceActor::FUN_10014aa0()
{
return SUCCESS;
}

View File

@ -167,11 +167,6 @@ undefined4 g_hitValerieSoundsIndex = 0;
// GLOBAL: LEGO1 0x100f0bb4 // GLOBAL: LEGO1 0x100f0bb4
MxLong g_unk0x100f0bb4 = 0; MxLong g_unk0x100f0bb4 = 0;
// Initialized at LEGO1 0x10012db0
// GLOBAL: LEGO1 0x10102af0
// GLOBAL: BETA10 0x102114c0
Mx3DPointFloat g_unk0x10102af0 = Mx3DPointFloat(0.0f, 2.0f, 0.0f);
// FUNCTION: LEGO1 0x10012950 // FUNCTION: LEGO1 0x10012950
LegoRaceCar::LegoRaceCar() LegoRaceCar::LegoRaceCar()
{ {
@ -197,6 +192,11 @@ MxLong LegoRaceCar::Notify(MxParam& p_param)
return LegoRaceMap::Notify(p_param); return LegoRaceMap::Notify(p_param);
} }
// Initialized at LEGO1 0x10012db0
// GLOBAL: LEGO1 0x10102af0
// GLOBAL: BETA10 0x102114c0
Mx3DPointFloat g_unk0x10102af0 = Mx3DPointFloat(0.0f, 2.0f, 0.0f);
// FUNCTION: LEGO1 0x10012de0 // FUNCTION: LEGO1 0x10012de0
void LegoRaceCar::FUN_10012de0() void LegoRaceCar::FUN_10012de0()
{ {
@ -340,8 +340,8 @@ void LegoRaceCar::FUN_10012ff0(float p_param)
// Possible bug in the original code: The first argument is not initialized // Possible bug in the original code: The first argument is not initialized
a->GetAnimTreePtr()->GetCamAnim()->FUN_1009f490(deltaTime, transformationMatrix); a->GetAnimTreePtr()->GetCamAnim()->FUN_1009f490(deltaTime, transformationMatrix);
if (r->GetCamera()) { if (r->GetCameraController()) {
r->GetCamera()->FUN_100123e0(transformationMatrix, 0); r->GetCameraController()->FUN_100123e0(transformationMatrix, 0);
} }
m_roi->FUN_100a58f0(transformationMatrix); m_roi->FUN_100a58f0(transformationMatrix);
@ -727,49 +727,3 @@ MxResult LegoJetski::HitActor(LegoPathActor* p_actor, MxBool p_bool)
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x10014150
MxU32 LegoJetski::VTable0x6c(
LegoPathBoundary* p_boundary,
Vector3& p_v1,
Vector3& p_v2,
float p_f1,
float p_f2,
Vector3& p_v3
)
{
return LegoJetskiRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
}
// FUNCTION: LEGO1 0x100141d0
void LegoJetski::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
{
LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
}
// FUNCTION: LEGO1 0x10014210
MxResult LegoJetski::VTable0x9c()
{
return LegoJetskiRaceActor::VTable0x9c();
}
// FUNCTION: LEGO1 0x10014500
// FUNCTION: BETA10 0x100cd5e0
MxU32 LegoRaceCar::VTable0x6c(
LegoPathBoundary* p_boundary,
Vector3& p_v1,
Vector3& p_v2,
float p_f1,
float p_f2,
Vector3& p_v3
)
{
return LegoCarRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
}
// FUNCTION: LEGO1 0x10014560
// FUNCTION: BETA10 0x100cd660
void LegoRaceCar::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
{
LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
}

View File

@ -166,7 +166,7 @@ MxS32 LegoCarRaceActor::VTable0x1c(LegoPathBoundary* p_boundary, LegoEdge* p_edg
m_destEdge->FUN_1002ddc0(*m_boundary, destEdgeUnknownVector); m_destEdge->FUN_1002ddc0(*m_boundary, destEdgeUnknownVector);
crossProduct.EqualsCross(m_boundary->GetUnknown0x14(), &destEdgeUnknownVector); crossProduct.EqualsCross(*m_boundary->GetUnknown0x14(), destEdgeUnknownVector);
crossProduct.Unitize(); crossProduct.Unitize();
Mx3DPointFloat worldDirection(Vector3(m_roi->GetWorldDirection())); Mx3DPointFloat worldDirection(Vector3(m_roi->GetWorldDirection()));
@ -260,8 +260,8 @@ MxResult LegoCarRaceActor::VTable0x9c()
d->FUN_1002ddc0(*b, point2); d->FUN_1002ddc0(*b, point2);
m_destEdge->FUN_1002ddc0(*m_boundary, point3); m_destEdge->FUN_1002ddc0(*m_boundary, point3);
point4.EqualsCross(&point2, m_boundary->GetUnknown0x14()); point4.EqualsCross(point2, *m_boundary->GetUnknown0x14());
point5.EqualsCross(m_boundary->GetUnknown0x14(), &point3); point5.EqualsCross(*m_boundary->GetUnknown0x14(), point3);
point4.Unitize(); point4.Unitize();
point5.Unitize(); point5.Unitize();

View File

@ -634,7 +634,7 @@ void LegoAnimPresenter::PutFrame()
FUN_1006b9a0(m_anim, time, m_unk0x78); FUN_1006b9a0(m_anim, time, m_unk0x78);
if (m_unk0x8c != NULL && m_currentWorld != NULL && m_currentWorld->GetCamera() != NULL) { if (m_unk0x8c != NULL && m_currentWorld != NULL && m_currentWorld->GetCameraController() != NULL) {
for (MxS32 i = 0; i < m_unk0x94; i++) { for (MxS32 i = 0; i < m_unk0x94; i++) {
if (m_unk0x8c[i] != NULL) { if (m_unk0x8c[i] != NULL) {
MxMatrix mat(m_unk0x8c[i]->GetLocal2World()); MxMatrix mat(m_unk0x8c[i]->GetLocal2World());
@ -650,11 +650,11 @@ void LegoAnimPresenter::PutFrame()
up = und; up = und;
up -= m_currentWorld->GetCamera()->GetWorldLocation(); up -= m_currentWorld->GetCameraController()->GetWorldLocation();
dir /= dirsqr; dir /= dirsqr;
pos.EqualsCross(&dir, &up); pos.EqualsCross(dir, up);
pos.Unitize(); pos.Unitize();
up.EqualsCross(&pos, &dir); up.EqualsCross(pos, dir);
pos *= possqr; pos *= possqr;
dir *= dirsqr; dir *= dirsqr;
up *= upsqr; up *= upsqr;
@ -716,7 +716,7 @@ MxResult LegoAnimPresenter::FUN_1006b140(LegoROI* p_roi)
for (i = 1; i <= m_roiMapSize; i++) { for (i = 1; i <= m_roiMapSize; i++) {
if (m_roiMap[i] == p_roi) { if (m_roiMap[i] == p_roi) {
if (local5c[i].Unknown(local58) != SUCCESS) { if (local5c[i].BETA_1005a590(local58) != SUCCESS) {
goto done; goto done;
} }
@ -930,8 +930,8 @@ void LegoAnimPresenter::FUN_1006b9a0(LegoAnim* p_anim, MxLong p_time, Matrix4* p
MxMatrix transform(mat); MxMatrix transform(mat);
p_anim->GetCamAnim()->FUN_1009f490(p_time, transform); p_anim->GetCamAnim()->FUN_1009f490(p_time, transform);
if (m_currentWorld != NULL && m_currentWorld->GetCamera() != NULL) { if (m_currentWorld != NULL && m_currentWorld->GetCameraController() != NULL) {
m_currentWorld->GetCamera()->FUN_100123e0(transform, 0); m_currentWorld->GetCameraController()->FUN_100123e0(transform, 0);
} }
} }

View File

@ -50,7 +50,7 @@ void LegoLoopingAnimPresenter::PutFrame()
FUN_1006b9a0(m_anim, time, m_unk0x78); FUN_1006b9a0(m_anim, time, m_unk0x78);
if (m_unk0x8c != NULL && m_currentWorld != NULL && m_currentWorld->GetCamera() != NULL) { if (m_unk0x8c != NULL && m_currentWorld != NULL && m_currentWorld->GetCameraController() != NULL) {
for (MxS32 i = 0; i < m_unk0x94; i++) { for (MxS32 i = 0; i < m_unk0x94; i++) {
if (m_unk0x8c[i] != NULL) { if (m_unk0x8c[i] != NULL) {
MxMatrix mat(m_unk0x8c[i]->GetLocal2World()); MxMatrix mat(m_unk0x8c[i]->GetLocal2World());
@ -66,11 +66,11 @@ void LegoLoopingAnimPresenter::PutFrame()
up = und; up = und;
up -= m_currentWorld->GetCamera()->GetWorldLocation(); up -= m_currentWorld->GetCameraController()->GetWorldLocation();
dir /= dirsqr; dir /= dirsqr;
pos.EqualsCross(&dir, &up); pos.EqualsCross(dir, up);
pos.Unitize(); pos.Unitize();
up.EqualsCross(&pos, &dir); up.EqualsCross(pos, dir);
pos *= possqr; pos *= possqr;
dir *= dirsqr; dir *= dirsqr;
up *= upsqr; up *= upsqr;

View File

@ -24,12 +24,6 @@ DECOMP_SIZE_ASSERT(LegoModelPresenter, 0x6c)
// GLOBAL: LEGO1 0x100f7ae0 // GLOBAL: LEGO1 0x100f7ae0
MxS32 g_modelPresenterConfig = 1; MxS32 g_modelPresenterConfig = 1;
// FUNCTION: LEGO1 0x1000cca0
void LegoModelPresenter::Destroy()
{
Destroy(FALSE);
}
// FUNCTION: LEGO1 0x1007f660 // FUNCTION: LEGO1 0x1007f660
void LegoModelPresenter::configureLegoModelPresenter(MxS32 p_modelPresenterConfig) void LegoModelPresenter::configureLegoModelPresenter(MxS32 p_modelPresenterConfig)
{ {

View File

@ -20,12 +20,6 @@ MxS32 g_partPresenterConfig1 = 1;
// GLOBAL: LEGO1 0x100f7aa4 // GLOBAL: LEGO1 0x100f7aa4
MxS32 g_partPresenterConfig2 = 100; MxS32 g_partPresenterConfig2 = 100;
// FUNCTION: LEGO1 0x1000cf60
void LegoPartPresenter::Destroy()
{
Destroy(FALSE);
}
// FUNCTION: LEGO1 0x1007c990 // FUNCTION: LEGO1 0x1007c990
void LegoPartPresenter::configureLegoPartPresenter(MxS32 p_partPresenterConfig1, MxS32 p_partPresenterConfig2) void LegoPartPresenter::configureLegoPartPresenter(MxS32 p_partPresenterConfig1, MxS32 p_partPresenterConfig2)
{ {

View File

@ -8,12 +8,12 @@
#include "mxdirectx/mxdirect3d.h" #include "mxdirectx/mxdirect3d.h"
#include "mxdirectx/mxstopwatch.h" #include "mxdirectx/mxstopwatch.h"
#include "mxdisplaysurface.h" #include "mxdisplaysurface.h"
#include "mxgeometry/mxmatrix.h"
#include "mxmisc.h" #include "mxmisc.h"
#include "mxpalette.h" #include "mxpalette.h"
#include "mxregion.h" #include "mxregion.h"
#include "mxtimer.h" #include "mxtimer.h"
#include "mxtransitionmanager.h" #include "mxtransitionmanager.h"
#include "realtime/matrix.h"
#include "realtime/realtime.h" #include "realtime/realtime.h"
#include "roi/legoroi.h" #include "roi/legoroi.h"
#include "tgl/d3drm/impl.h" #include "tgl/d3drm/impl.h"

View File

@ -799,7 +799,7 @@ void Act3::DebugCopter(
const Matrix4& p_destination, const Matrix4& p_destination,
const Matrix4& p_startPosition, const Matrix4& p_startPosition,
const Matrix4& p_endPosition, const Matrix4& p_endPosition,
const UnknownMx4DPointFloat& p_unk0x1f4 const MxQuaternionTransformer& p_unk0x1f4
) )
{ {
DebugPrintf("Copter matrix...\n\n"); DebugPrintf("Copter matrix...\n\n");
@ -831,10 +831,10 @@ void Act3::DebugCopter(
Mx4DPointFloat unk0x00, unk0x18; Mx4DPointFloat unk0x00, unk0x18;
if (p_unk0x1f4.GetUnknown0x30() != 0) { if (p_unk0x1f4.GetFlags() != 0) {
// TODO: Match // TODO: Match
unk0x00 = p_unk0x1f4.GetUnknown0x00(); unk0x00 = p_unk0x1f4.GetStartQuat();
unk0x18 = p_unk0x1f4.GetUnknown0x18(); unk0x18 = p_unk0x1f4.GetEndQuat();
DebugPrintf("Source quaternion..."); DebugPrintf("Source quaternion...");
// STRING: LEGO1 0x100f7864 // STRING: LEGO1 0x100f7864

View File

@ -48,12 +48,6 @@ GasStation::GasStation()
NotificationManager()->Register(this); NotificationManager()->Register(this);
} }
// FUNCTION: LEGO1 0x10004770
MxBool GasStation::VTable0x5c()
{
return TRUE;
}
// FUNCTION: LEGO1 0x100048c0 // FUNCTION: LEGO1 0x100048c0
GasStation::~GasStation() GasStation::~GasStation()
{ {
@ -69,6 +63,7 @@ GasStation::~GasStation()
} }
// FUNCTION: LEGO1 0x10004990 // FUNCTION: LEGO1 0x10004990
// FUNCTION: BETA10 0x100286c0
MxResult GasStation::Create(MxDSAction& p_dsAction) MxResult GasStation::Create(MxDSAction& p_dsAction)
{ {
MxResult result = LegoWorld::Create(p_dsAction); MxResult result = LegoWorld::Create(p_dsAction);
@ -82,13 +77,13 @@ MxResult GasStation::Create(MxDSAction& p_dsAction)
m_state = (GasStationState*) GameState()->GetState("GasStationState"); m_state = (GasStationState*) GameState()->GetState("GasStationState");
if (!m_state) { if (!m_state) {
m_state = (GasStationState*) GameState()->CreateState("GasStationState"); m_state = (GasStationState*) GameState()->CreateState("GasStationState");
m_state->m_unk0x14.m_unk0x00 = 1; m_state->m_unk0x14 = 1;
} }
else if (m_state->m_unk0x14.m_unk0x00 == 4) { else if (m_state->m_unk0x14 == 4) {
m_state->m_unk0x14.m_unk0x00 = 4; m_state->m_unk0x14 = 4;
} }
else { else {
m_state->m_unk0x14.m_unk0x00 = 3; m_state->m_unk0x14 = 3;
} }
GameState()->m_currentArea = LegoGameState::e_garage; GameState()->m_currentArea = LegoGameState::e_garage;
@ -122,6 +117,7 @@ MxLong GasStation::Notify(MxParam& p_param)
result = HandleControl((LegoControlManagerNotificationParam&) p_param); result = HandleControl((LegoControlManagerNotificationParam&) p_param);
break; break;
case c_notificationTransitioned: case c_notificationTransitioned:
assert(m_destLocation != LegoGameState::e_undefined);
GameState()->SwitchArea(m_destLocation); GameState()->SwitchArea(m_destLocation);
break; break;
} }
@ -131,6 +127,7 @@ MxLong GasStation::Notify(MxParam& p_param)
} }
// FUNCTION: LEGO1 0x10004b30 // FUNCTION: LEGO1 0x10004b30
// FUNCTION: BETA10 0x10028a5e
void GasStation::ReadyWorld() void GasStation::ReadyWorld()
{ {
PlayMusic(JukeboxScript::c_JBMusic2); PlayMusic(JukeboxScript::c_JBMusic2);
@ -142,22 +139,22 @@ void GasStation::ReadyWorld()
case LegoActor::c_pepper: case LegoActor::c_pepper:
switch (m_state->m_pepperAction) { switch (m_state->m_pepperAction) {
case 0: case 0:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs002nu_RunAnim); PlayAction(GarageScript::c_wgs002nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
case 1: case 1:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs003nu_RunAnim); PlayAction(GarageScript::c_wgs003nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
case 2: case 2:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs004nu_RunAnim); PlayAction(GarageScript::c_wgs004nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
default: default:
m_state->m_unk0x14.m_unk0x00 = 6; m_state->m_unk0x14 = 6;
PlayAction(GarageScript::c_wgs008nu_RunAnim); PlayAction(GarageScript::c_wgs008nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
m_unk0x104 = 1; m_unk0x104 = 1;
@ -167,23 +164,21 @@ void GasStation::ReadyWorld()
if (m_state->m_pepperAction < 5) { if (m_state->m_pepperAction < 5) {
m_state->m_pepperAction++; m_state->m_pepperAction++;
} }
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
break; break;
case LegoActor::c_mama: case LegoActor::c_mama:
switch (m_state->m_mamaAction) { switch (m_state->m_mamaAction) {
case 0: case 0:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs006nu_RunAnim); PlayAction(GarageScript::c_wgs006nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
case 1: case 1:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs007nu_RunAnim); PlayAction(GarageScript::c_wgs007nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
default: default:
m_state->m_unk0x14.m_unk0x00 = 6; m_state->m_unk0x14 = 6;
PlayAction(GarageScript::c_wgs008nu_RunAnim); PlayAction(GarageScript::c_wgs008nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
m_unk0x104 = 1; m_unk0x104 = 1;
@ -193,49 +188,21 @@ void GasStation::ReadyWorld()
if (m_state->m_mamaAction < 5) { if (m_state->m_mamaAction < 5) {
m_state->m_mamaAction++; m_state->m_mamaAction++;
} }
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
break;
case LegoActor::c_papa:
switch (m_state->m_papaAction) {
case 0:
m_state->m_unk0x14.m_unk0x00 = 5;
PlayAction(GarageScript::c_wgs012nu_RunAnim);
m_unk0x106 = 1;
break;
case 1:
m_state->m_unk0x14.m_unk0x00 = 5;
PlayAction(GarageScript::c_wgs014nu_RunAnim);
m_unk0x106 = 1;
break;
default:
m_state->m_unk0x14.m_unk0x00 = 6;
PlayAction(GarageScript::c_wgs017nu_RunAnim);
m_unk0x106 = 1;
m_unk0x104 = 1;
break;
}
if (m_state->m_papaAction < 5) {
m_state->m_papaAction++;
}
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
break; break;
case LegoActor::c_nick: case LegoActor::c_nick:
switch (m_state->m_nickAction) { switch (m_state->m_nickAction) {
case 0: case 0:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs009nu_RunAnim); PlayAction(GarageScript::c_wgs009nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
case 1: case 1:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs010nu_RunAnim); PlayAction(GarageScript::c_wgs010nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
default: default:
m_state->m_unk0x14.m_unk0x00 = 6; m_state->m_unk0x14 = 6;
PlayAction(GarageScript::c_wgs008nu_RunAnim); PlayAction(GarageScript::c_wgs008nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
m_unk0x104 = 1; m_unk0x104 = 1;
@ -245,23 +212,45 @@ void GasStation::ReadyWorld()
if (m_state->m_nickAction < 5) { if (m_state->m_nickAction < 5) {
m_state->m_nickAction++; m_state->m_nickAction++;
} }
break;
case LegoActor::c_papa:
switch (m_state->m_papaAction) {
case 0:
m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs012nu_RunAnim);
m_unk0x106 = 1;
break;
case 1:
m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs014nu_RunAnim);
m_unk0x106 = 1;
break;
default:
m_state->m_unk0x14 = 6;
PlayAction(GarageScript::c_wgs017nu_RunAnim);
m_unk0x106 = 1;
m_unk0x104 = 1;
break;
}
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); if (m_state->m_papaAction < 5) {
m_state->m_papaAction++;
}
break; break;
case LegoActor::c_laura: case LegoActor::c_laura:
switch (m_state->m_lauraAction) { switch (m_state->m_lauraAction) {
case 0: case 0:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs020nu_RunAnim); PlayAction(GarageScript::c_wgs020nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
case 1: case 1:
m_state->m_unk0x14.m_unk0x00 = 5; m_state->m_unk0x14 = 5;
PlayAction(GarageScript::c_wgs021nu_RunAnim); PlayAction(GarageScript::c_wgs021nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
break; break;
default: default:
m_state->m_unk0x14.m_unk0x00 = 6; m_state->m_unk0x14 = 6;
PlayAction(GarageScript::c_wgs022nu_RunAnim); PlayAction(GarageScript::c_wgs022nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
m_unk0x104 = 1; m_unk0x104 = 1;
@ -271,13 +260,12 @@ void GasStation::ReadyWorld()
if (m_state->m_lauraAction < 5) { if (m_state->m_lauraAction < 5) {
m_state->m_lauraAction++; m_state->m_lauraAction++;
} }
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
break; break;
default: default:
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
break; break;
} }
FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen);
} }
// FUNCTION: LEGO1 0x10005590 // FUNCTION: LEGO1 0x10005590
@ -315,10 +303,10 @@ MxLong GasStation::HandleEndAction(MxEndActionNotificationParam& p_param)
m_state->StopAction((GarageScript::Script) action->GetObjectId()); m_state->StopAction((GarageScript::Script) action->GetObjectId());
m_unk0x106 = 0; m_unk0x106 = 0;
switch (m_state->m_unk0x14.m_unk0x00) { switch (m_state->m_unk0x14) {
case 5: case 5:
g_unk0x100f0160 = 0; g_unk0x100f0160 = 0;
m_state->m_unk0x14.m_unk0x00 = 6; m_state->m_unk0x14 = 6;
m_unk0x115 = TRUE; m_unk0x115 = TRUE;
PlayAction(GarageScript::c_wgs023nu_RunAnim); PlayAction(GarageScript::c_wgs023nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
@ -329,17 +317,17 @@ MxLong GasStation::HandleEndAction(MxEndActionNotificationParam& p_param)
m_unk0x115 = TRUE; m_unk0x115 = TRUE;
if (m_unk0x104 == 3) { if (m_unk0x104 == 3) {
m_state->m_unk0x14.m_unk0x00 = 8; m_state->m_unk0x14 = 8;
PlayAction(GarageScript::c_wgs029nu_RunAnim); PlayAction(GarageScript::c_wgs029nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
} }
else { else {
m_state->m_unk0x14.m_unk0x00 = 7; m_state->m_unk0x14 = 7;
m_unk0x114 = TRUE; m_unk0x114 = TRUE;
} }
break; break;
case 8: case 8:
m_state->m_unk0x14.m_unk0x00 = 2; m_state->m_unk0x14 = 2;
((Act1State*) GameState()->GetState("Act1State"))->m_unk0x018 = 7; ((Act1State*) GameState()->GetState("Act1State"))->m_unk0x018 = 7;
m_destLocation = LegoGameState::e_unk28; m_destLocation = LegoGameState::e_unk28;
m_radio.Stop(); m_radio.Stop();
@ -378,8 +366,8 @@ MxLong GasStation::HandleButtonDown(LegoControlManagerNotificationParam& p_param
m_unk0x104 = 3; m_unk0x104 = 3;
m_unk0x114 = FALSE; m_unk0x114 = FALSE;
if (m_state->m_unk0x14.m_unk0x00 == 7) { if (m_state->m_unk0x14 == 7) {
m_state->m_unk0x14.m_unk0x00 = 8; m_state->m_unk0x14 = 8;
PlayAction(GarageScript::c_wgs029nu_RunAnim); PlayAction(GarageScript::c_wgs029nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
} }
@ -405,7 +393,7 @@ MxLong GasStation::HandleControl(LegoControlManagerNotificationParam& p_param)
switch (p_param.GetClickedObjectId()) { switch (p_param.GetClickedObjectId()) {
case GarageScript::c_LeftArrow_Ctl: case GarageScript::c_LeftArrow_Ctl:
case GarageScript::c_RightArrow_Ctl: case GarageScript::c_RightArrow_Ctl:
m_state->m_unk0x14.m_unk0x00 = 0; m_state->m_unk0x14 = 0;
m_destLocation = LegoGameState::Area::e_garadoor; m_destLocation = LegoGameState::Area::e_garadoor;
m_state->StopActions(); m_state->StopActions();
@ -414,7 +402,7 @@ MxLong GasStation::HandleControl(LegoControlManagerNotificationParam& p_param)
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
break; break;
case GarageScript::c_Info_Ctl: case GarageScript::c_Info_Ctl:
m_state->m_unk0x14.m_unk0x00 = 0; m_state->m_unk0x14 = 0;
m_destLocation = LegoGameState::Area::e_infomain; m_destLocation = LegoGameState::Area::e_infomain;
m_state->StopActions(); m_state->StopActions();
@ -423,7 +411,7 @@ MxLong GasStation::HandleControl(LegoControlManagerNotificationParam& p_param)
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
break; break;
case GarageScript::c_Buggy_Ctl: case GarageScript::c_Buggy_Ctl:
m_state->m_unk0x14.m_unk0x00 = 0; m_state->m_unk0x14 = 0;
m_destLocation = LegoGameState::Area::e_dunecarbuild; m_destLocation = LegoGameState::Area::e_dunecarbuild;
m_state->StopActions(); m_state->StopActions();
@ -478,7 +466,7 @@ MxResult GasStation::Tickle()
else if (m_unk0x104 != 0) { else if (m_unk0x104 != 0) {
m_unk0x104 = 0; m_unk0x104 = 0;
MxDSAction action; MxDSAction action;
m_state->m_unk0x14.m_unk0x00 = 9; m_state->m_unk0x14 = 9;
PlayAction(GarageScript::c_wgs031nu_RunAnim); PlayAction(GarageScript::c_wgs031nu_RunAnim);
m_unk0x106 = 1; m_unk0x106 = 1;
} }
@ -501,7 +489,7 @@ MxBool GasStation::Escape()
{ {
m_radio.Stop(); m_radio.Stop();
m_state->StopActions(); m_state->StopActions();
m_state->m_unk0x14.m_unk0x00 = 0; m_state->m_unk0x14 = 0;
m_destLocation = LegoGameState::Area::e_infomain; m_destLocation = LegoGameState::Area::e_infomain;
return TRUE; return TRUE;
} }

View File

@ -132,12 +132,12 @@ Infocenter::Infocenter()
m_selectedCharacter = e_noCharacter; m_selectedCharacter = e_noCharacter;
m_unk0x11c = NULL; m_unk0x11c = NULL;
m_infocenterState = NULL; m_infocenterState = NULL;
m_frameHotBitmap = NULL; m_frame = NULL;
m_destLocation = LegoGameState::e_undefined; m_destLocation = LegoGameState::e_undefined;
m_currentInfomainScript = InfomainScript::c_noneInfomain; m_currentInfomainScript = InfomainScript::c_noneInfomain;
m_currentCutscene = e_noIntro; m_currentCutscene = e_noIntro;
memset(&m_mapAreas, 0, sizeof(m_mapAreas)); memset(&m_glowInfo, 0, sizeof(m_glowInfo));
m_unk0x1c8 = -1; m_unk0x1c8 = -1;
SetAppCursor(e_cursorBusy); SetAppCursor(e_cursorBusy);
@ -612,6 +612,7 @@ void Infocenter::ReadyWorld()
} }
// FUNCTION: LEGO1 0x1006f9a0 // FUNCTION: LEGO1 0x1006f9a0
// FUNCTION: BETA10 0x1002ef2f
void Infocenter::InitializeBitmaps() void Infocenter::InitializeBitmaps()
{ {
m_radio.Initialize(TRUE); m_radio.Initialize(TRUE);
@ -632,56 +633,64 @@ void Infocenter::InitializeBitmaps()
((MxPresenter*) Find(m_atomId, InfomainScript::c_Laura_Ctl))->Enable(TRUE); ((MxPresenter*) Find(m_atomId, InfomainScript::c_Laura_Ctl))->Enable(TRUE);
((MxPresenter*) Find(m_atomId, InfomainScript::c_Radio_Ctl))->Enable(TRUE); ((MxPresenter*) Find(m_atomId, InfomainScript::c_Radio_Ctl))->Enable(TRUE);
m_mapAreas[0].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Info_A_Bitmap"); m_glowInfo[0].m_destCtl = (MxStillPresenter*) Find("MxStillPresenter", "Info_A_Bitmap");
m_mapAreas[0].m_area.SetLeft(391); assert(m_glowInfo[0].m_destCtl);
m_mapAreas[0].m_area.SetTop(182); m_glowInfo[0].m_area.SetLeft(391);
m_mapAreas[0].m_area.SetRight(427); m_glowInfo[0].m_area.SetTop(182);
m_mapAreas[0].m_area.SetBottom(230); m_glowInfo[0].m_area.SetRight(427);
m_mapAreas[0].m_unk0x04 = 3; m_glowInfo[0].m_area.SetBottom(230);
m_glowInfo[0].m_unk0x04 = 3;
m_mapAreas[1].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Boat_A_Bitmap"); m_glowInfo[1].m_destCtl = (MxStillPresenter*) Find("MxStillPresenter", "Boat_A_Bitmap");
m_mapAreas[1].m_area.SetLeft(304); assert(m_glowInfo[1].m_destCtl);
m_mapAreas[1].m_area.SetTop(225); m_glowInfo[1].m_area.SetLeft(304);
m_mapAreas[1].m_area.SetRight(350); m_glowInfo[1].m_area.SetTop(225);
m_mapAreas[1].m_area.SetBottom(268); m_glowInfo[1].m_area.SetRight(350);
m_mapAreas[1].m_unk0x04 = 10; m_glowInfo[1].m_area.SetBottom(268);
m_glowInfo[1].m_unk0x04 = 10;
m_mapAreas[2].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Race_A_Bitmap"); m_glowInfo[2].m_destCtl = (MxStillPresenter*) Find("MxStillPresenter", "Race_A_Bitmap");
m_mapAreas[2].m_area.SetLeft(301); assert(m_glowInfo[1].m_destCtl); // DECOMP: intentional typo
m_mapAreas[2].m_area.SetTop(133); m_glowInfo[2].m_area.SetLeft(301);
m_mapAreas[2].m_area.SetRight(347); m_glowInfo[2].m_area.SetTop(133);
m_mapAreas[2].m_area.SetBottom(181); m_glowInfo[2].m_area.SetRight(347);
m_mapAreas[2].m_unk0x04 = 11; m_glowInfo[2].m_area.SetBottom(181);
m_glowInfo[2].m_unk0x04 = 11;
m_mapAreas[3].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Pizza_A_Bitmap"); m_glowInfo[3].m_destCtl = (MxStillPresenter*) Find("MxStillPresenter", "Pizza_A_Bitmap");
m_mapAreas[3].m_area.SetLeft(289); assert(m_glowInfo[3].m_destCtl);
m_mapAreas[3].m_area.SetTop(182); m_glowInfo[3].m_area.SetLeft(289);
m_mapAreas[3].m_area.SetRight(335); m_glowInfo[3].m_area.SetTop(182);
m_mapAreas[3].m_area.SetBottom(225); m_glowInfo[3].m_area.SetRight(335);
m_mapAreas[3].m_unk0x04 = 12; m_glowInfo[3].m_area.SetBottom(225);
m_glowInfo[3].m_unk0x04 = 12;
m_mapAreas[4].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Gas_A_Bitmap"); m_glowInfo[4].m_destCtl = (MxStillPresenter*) Find("MxStillPresenter", "Gas_A_Bitmap");
m_mapAreas[4].m_area.SetLeft(350); assert(m_glowInfo[4].m_destCtl);
m_mapAreas[4].m_area.SetTop(161); m_glowInfo[4].m_area.SetLeft(350);
m_mapAreas[4].m_area.SetRight(391); m_glowInfo[4].m_area.SetTop(161);
m_mapAreas[4].m_area.SetBottom(209); m_glowInfo[4].m_area.SetRight(391);
m_mapAreas[4].m_unk0x04 = 13; m_glowInfo[4].m_area.SetBottom(209);
m_glowInfo[4].m_unk0x04 = 13;
m_mapAreas[5].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Med_A_Bitmap"); m_glowInfo[5].m_destCtl = (MxStillPresenter*) Find("MxStillPresenter", "Med_A_Bitmap");
m_mapAreas[5].m_area.SetLeft(392); assert(m_glowInfo[5].m_destCtl);
m_mapAreas[5].m_area.SetTop(130); m_glowInfo[5].m_area.SetLeft(392);
m_mapAreas[5].m_area.SetRight(438); m_glowInfo[5].m_area.SetTop(130);
m_mapAreas[5].m_area.SetBottom(176); m_glowInfo[5].m_area.SetRight(438);
m_mapAreas[5].m_unk0x04 = 14; m_glowInfo[5].m_area.SetBottom(176);
m_glowInfo[5].m_unk0x04 = 14;
m_mapAreas[6].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Cop_A_Bitmap"); m_glowInfo[6].m_destCtl = (MxStillPresenter*) Find("MxStillPresenter", "Cop_A_Bitmap");
m_mapAreas[6].m_area.SetLeft(396); assert(m_glowInfo[6].m_destCtl);
m_mapAreas[6].m_area.SetTop(229); m_glowInfo[6].m_area.SetLeft(396);
m_mapAreas[6].m_area.SetRight(442); m_glowInfo[6].m_area.SetTop(229);
m_mapAreas[6].m_area.SetBottom(272); m_glowInfo[6].m_area.SetRight(442);
m_mapAreas[6].m_unk0x04 = 15; m_glowInfo[6].m_area.SetBottom(272);
m_glowInfo[6].m_unk0x04 = 15;
m_frameHotBitmap = (MxStillPresenter*) Find("MxStillPresenter", "FrameHot_Bitmap"); m_frame = (MxStillPresenter*) Find("MxStillPresenter", "FrameHot_Bitmap");
assert(m_frame);
UpdateFrameHot(TRUE); UpdateFrameHot(TRUE);
} }
@ -831,7 +840,7 @@ MxU8 Infocenter::HandleButtonUp(MxS32 p_x, MxS32 p_y)
if (m_unk0x1c8 != -1) { if (m_unk0x1c8 != -1) {
m_infoManDialogueTimer = 0; m_infoManDialogueTimer = 0;
switch (m_mapAreas[m_unk0x1c8].m_unk0x04) { switch (m_glowInfo[m_unk0x1c8].m_unk0x04) {
case 3: case 3:
GameState()->SetActor(m_selectedCharacter); GameState()->SetActor(m_selectedCharacter);
@ -1304,11 +1313,11 @@ MxBool Infocenter::VTable0x5c()
void Infocenter::FUN_10070d10(MxS32 p_x, MxS32 p_y) void Infocenter::FUN_10070d10(MxS32 p_x, MxS32 p_y)
{ {
MxS16 i; MxS16 i;
for (i = 0; i < (MxS32) (sizeof(m_mapAreas) / sizeof(m_mapAreas[0])); i++) { for (i = 0; i < (MxS32) (sizeof(m_glowInfo) / sizeof(m_glowInfo[0])); i++) {
MxS32 right = m_mapAreas[i].m_area.GetRight(); MxS32 right = m_glowInfo[i].m_area.GetRight();
MxS32 bottom = m_mapAreas[i].m_area.GetBottom(); MxS32 bottom = m_glowInfo[i].m_area.GetBottom();
MxS32 left = m_mapAreas[i].m_area.GetLeft(); MxS32 left = m_glowInfo[i].m_area.GetLeft();
MxS32 top = m_mapAreas[i].m_area.GetTop(); MxS32 top = m_glowInfo[i].m_area.GetTop();
if (left <= p_x && p_x <= right && top <= p_y && p_y <= bottom) { if (left <= p_x && p_x <= right && top <= p_y && p_y <= bottom) {
break; break;
@ -1321,12 +1330,12 @@ void Infocenter::FUN_10070d10(MxS32 p_x, MxS32 p_y)
if (i != m_unk0x1c8) { if (i != m_unk0x1c8) {
if (m_unk0x1c8 != -1) { if (m_unk0x1c8 != -1) {
m_mapAreas[m_unk0x1c8].m_presenter->Enable(FALSE); m_glowInfo[m_unk0x1c8].m_destCtl->Enable(FALSE);
} }
m_unk0x1c8 = i; m_unk0x1c8 = i;
if (i != -1) { if (i != -1) {
m_mapAreas[i].m_presenter->Enable(TRUE); m_glowInfo[i].m_destCtl->Enable(TRUE);
} }
} }
} }
@ -1362,18 +1371,18 @@ void Infocenter::UpdateFrameHot(MxBool p_display)
return; return;
} }
MxS32 originalDisplayZ = m_frameHotBitmap->GetDisplayZ(); MxS32 originalDisplayZ = m_frame->GetDisplayZ();
m_frameHotBitmap->SetDisplayZ(1000); m_frame->SetDisplayZ(1000);
VideoManager()->SortPresenterList(); VideoManager()->SortPresenterList();
m_frameHotBitmap->Enable(TRUE); m_frame->Enable(TRUE);
m_frameHotBitmap->SetPosition(x, y); m_frame->SetPosition(x, y);
m_frameHotBitmap->SetDisplayZ(originalDisplayZ); m_frame->SetDisplayZ(originalDisplayZ);
} }
else { else {
if (m_frameHotBitmap) { if (m_frame) {
m_frameHotBitmap->Enable(FALSE); m_frame->Enable(FALSE);
} }
} }
} }

View File

@ -327,7 +327,7 @@ MxLong LegoAct2::Notify(MxParam& p_param)
local90 *= 1.25f; local90 *= 1.25f;
locala4 += local90; locala4 += local90;
locala4[1] += 0.25; locala4[1] += 0.25;
local30.EqualsCross(&localac, &local28); local30.EqualsCross(localac, local28);
local30.Unitize(); local30.Unitize();
Mx3DPointFloat locald4(local2world[2]); Mx3DPointFloat locald4(local2world[2]);
@ -1155,7 +1155,7 @@ MxResult LegoAct2::FUN_10052560(
Vector3 secondColumn(matrix[1]); Vector3 secondColumn(matrix[1]);
Vector3 thirdColumn(matrix[2]); Vector3 thirdColumn(matrix[2]);
firstColumn.EqualsCross(&secondColumn, &thirdColumn); firstColumn.EqualsCross(secondColumn, thirdColumn);
firstColumn.Unitize(); firstColumn.Unitize();
MxMatrix* pmatrix = NULL; MxMatrix* pmatrix = NULL;

View File

@ -32,12 +32,6 @@ Score::Score()
NotificationManager()->Register(this); NotificationManager()->Register(this);
} }
// FUNCTION: LEGO1 0x100010b0
MxBool Score::VTable0x5c()
{
return TRUE;
}
// FUNCTION: LEGO1 0x10001200 // FUNCTION: LEGO1 0x10001200
Score::~Score() Score::~Score()
{ {
@ -260,7 +254,8 @@ void Score::Paint()
memset(&desc, 0, sizeof(desc)); memset(&desc, 0, sizeof(desc));
desc.dwSize = sizeof(desc); desc.dwSize = sizeof(desc);
if (cube->m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) { HRESULT result = cube->m_surface->Lock(NULL, &desc, DDLOCK_SURFACEMEMORYPTR, NULL);
if (result == DD_OK) {
if (desc.lPitch != desc.dwWidth) { if (desc.lPitch != desc.dwWidth) {
cube->m_surface->Unlock(desc.lpSurface); cube->m_surface->Unlock(desc.lpSurface);
return; return;
@ -296,7 +291,7 @@ void Score::Paint()
// FUNCTION: LEGO1 0x10001d20 // FUNCTION: LEGO1 0x10001d20
// FUNCTION: BETA10 0x100f4a52 // FUNCTION: BETA10 0x100f4a52
void Score::FillArea(MxU32 i_activity, MxU32 i_actor, MxS16 score) void Score::FillArea(MxS32 i_activity, MxS32 i_actor, MxS16 score)
{ {
MxS32 local3c[] = {0x2b00, 0x5700, 0x8000, 0xab00, 0xd600}; MxS32 local3c[] = {0x2b00, 0x5700, 0x8000, 0xab00, 0xd600};
MxS32 local14[] = {0x2a, 0x27, 0x29, 0x29, 0x2a}; MxS32 local14[] = {0x2a, 0x27, 0x29, 0x29, 0x2a};
@ -304,6 +299,10 @@ void Score::FillArea(MxU32 i_activity, MxU32 i_actor, MxS16 score)
MxS32 local28[] = {0x25, 0x29, 0x27, 0x28, 0x28}; MxS32 local28[] = {0x25, 0x29, 0x27, 0x28, 0x28};
MxS32 colors[] = {0x11, 0x0f, 0x08, 0x05}; MxS32 colors[] = {0x11, 0x0f, 0x08, 0x05};
assert(i_activity >= 0 && i_activity < 5);
assert(i_actor >= 0 && i_actor < 5);
assert(score >= 0 && score < 4);
MxU8* ptr = m_surface + local3c[i_actor] + local50[i_activity]; MxU8* ptr = m_surface + local3c[i_actor] + local50[i_activity];
MxS32 color = colors[score]; MxS32 color = colors[score];
MxS32 size = local28[i_activity]; MxS32 size = local28[i_activity];

View File

@ -1,6 +1,7 @@
#include "legoanim.h" #include "legoanim.h"
#include "mxgeometry/mxmatrix.h" #include "mxgeometry/mxmatrix.h"
#include "mxgeometry/mxquaternion.h"
#include <limits.h> #include <limits.h>
@ -231,10 +232,10 @@ LegoResult LegoAnimScene::FUN_1009f490(LegoFloat p_time, Matrix4& p_matrix)
local54 -= localb8; local54 -= localb8;
if (local54.Unitize() == 0) { if (local54.Unitize() == 0) {
local5c.EqualsCross(&local68, &local54); local5c.EqualsCross(local68, local54);
if (local5c.Unitize() == 0) { if (local5c.Unitize() == 0) {
local68.EqualsCross(&local54, &local5c); local68.EqualsCross(local54, local5c);
localcc = p_matrix[3]; localcc = p_matrix[3];
localcc += localb0[3]; localcc += localb0[3];
@ -851,7 +852,7 @@ inline void LegoAnimNodeData::GetTranslation(
break; break;
case 2: case 2:
Mx4DPointFloat a; Mx4DPointFloat a;
UnknownMx4DPointFloat b; MxQuaternionTransformer b;
if (p_rotationKeys[i].TestBit1() || p_rotationKeys[i + 1].TestBit1()) { if (p_rotationKeys[i].TestBit1() || p_rotationKeys[i + 1].TestBit1()) {
a[0] = p_rotationKeys[i].GetX(); a[0] = p_rotationKeys[i].GetX();
@ -878,9 +879,9 @@ inline void LegoAnimNodeData::GetTranslation(
c[3] = p_rotationKeys[i + 1].GetAngle(); c[3] = p_rotationKeys[i + 1].GetAngle();
} }
b.BETA_10180b80(a); b.SetStart(a);
b.BETA_10180bc0(c); b.SetEnd(c);
b.BETA_1004aaa0( b.InterpolateToMatrix(
p_matrix, p_matrix,
(p_time - p_rotationKeys[i].GetTime()) / (p_rotationKeys[i + 1].GetTime() - p_rotationKeys[i].GetTime()) (p_time - p_rotationKeys[i].GetTime()) / (p_rotationKeys[i + 1].GetTime() - p_rotationKeys[i].GetTime())
); );
@ -1163,7 +1164,7 @@ undefined4 LegoAnim::GetActorUnknown0x04(LegoU32 p_index)
return m_modelList[p_index].m_unk0x04; return m_modelList[p_index].m_unk0x04;
} }
return NULL; return 0;
} }
// FUNCTION: LEGO1 0x100a0f60 // FUNCTION: LEGO1 0x100a0f60

View File

@ -139,10 +139,10 @@ LegoS32 LegoWEGEdge::VTable0x04()
Mx3DPointFloat local58; Mx3DPointFloat local58;
Vector3 local64(&m_edgeNormals[i][0]); Vector3 local64(&m_edgeNormals[i][0]);
edge->FUN_1002ddc0(*this, local58); edge->FUN_1002ddc0(*this, local58);
local64.EqualsCross(&local58, &m_unk0x14); local64.EqualsCross(local58, m_unk0x14);
m_edgeNormals[i][3] = -local64.Dot(m_edges[i]->m_pointA, &local64); m_edgeNormals[i][3] = -local64.Dot(*m_edges[i]->m_pointA, local64);
if (m_edgeNormals[i][3] + m_unk0x30.Dot(&m_unk0x30, &local64) < 0.0f) { if (m_edgeNormals[i][3] + m_unk0x30.Dot(m_unk0x30, local64) < 0.0f) {
m_edgeNormals[i] *= -1.0f; m_edgeNormals[i] *= -1.0f;
} }
@ -178,12 +178,12 @@ LegoS32 LegoWEGEdge::VTable0x04()
localb8 -= *vTrig1; localb8 -= *vTrig1;
local80 -= *vTrig1; local80 -= *vTrig1;
float locala4 = localb8.Dot(m_unk0x50, &localb8); float locala4 = localb8.Dot(*m_unk0x50, localb8);
if (local98 < locala4) { if (local98 < locala4) {
local98 = locala4; local98 = locala4;
} }
locala4 = local80.Dot(m_unk0x50, &local80); locala4 = local80.Dot(*m_unk0x50, local80);
if (locala4 < local9c) { if (locala4 < local9c) {
local9c = locala4; local9c = locala4;
} }
@ -244,7 +244,7 @@ LegoS32 LegoWEGEdge::FUN_1009aea0()
local50 = *local8[i - 2]; local50 = *local8[i - 2];
local50 -= *local8[i - 1]; local50 -= *local8[i - 1];
local24.EqualsCross(&local50, &local3c); local24.EqualsCross(local50, local3c);
local28 = local24.LenSquared(); local28 = local24.LenSquared();
if (local28 < 0.00001f) { if (local28 < 0.00001f) {
@ -255,7 +255,7 @@ LegoS32 LegoWEGEdge::FUN_1009aea0()
local24 /= local58; local24 /= local58;
if (localc) { if (localc) {
float local54 = local24.Dot(&m_unk0x14, &local24); float local54 = local24.Dot(m_unk0x14, local24);
if (local54 < 0.98) { if (local54 < 0.98) {
delete[] local8; delete[] local8;
return -2; return -2;
@ -265,7 +265,7 @@ LegoS32 LegoWEGEdge::FUN_1009aea0()
m_unk0x14[0] = local24[0]; m_unk0x14[0] = local24[0];
m_unk0x14[1] = local24[1]; m_unk0x14[1] = local24[1];
m_unk0x14[2] = local24[2]; m_unk0x14[2] = local24[2];
m_unk0x14[3] = -local8[i]->Dot(local8[i], &local24); m_unk0x14[3] = -local8[i]->Dot(*local8[i], local24);
localc = TRUE; localc = TRUE;
} }
} }

View File

@ -4,6 +4,7 @@
#include "decomp.h" #include "decomp.h"
#include "legoweedge.h" #include "legoweedge.h"
#include "mxgeometry/mxgeometry3d.h" #include "mxgeometry/mxgeometry3d.h"
#include "mxgeometry/mxgeometry4d.h"
class LegoPathStruct; class LegoPathStruct;

View File

@ -57,7 +57,6 @@ class LegoContainer {
} }
} }
// FUNCTION: BETA10 0x1007bc00
T* Get(const char* p_name) T* Get(const char* p_name)
{ {
T* value = NULL; T* value = NULL;
@ -197,4 +196,7 @@ class LegoTextureContainer : public LegoContainer<LegoTextureInfo> {
// _Tree<char const *,pair<char const * const,LegoTextureInfo *>,map<char const *,LegoTextureInfo *,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Kfn,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Nil // _Tree<char const *,pair<char const * const,LegoTextureInfo *>,map<char const *,LegoTextureInfo *,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Kfn,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Nil
// clang-format on // clang-format on
// TEMPLATE: BETA10 0x1007bc00
// LegoContainer<LegoTextureInfo>::Get
#endif // LEGOCONTAINER_H #endif // LEGOCONTAINER_H

View File

@ -138,7 +138,7 @@ class LegoFile : public LegoStorage {
const char* data = p_str.GetData(); const char* data = p_str.GetData();
LegoU32 fullLength = strlen(data); LegoU32 fullLength = strlen(data);
LegoU16 limitedLength = fullLength; LegoU16 limitedLength = (LegoU16) fullLength;
Write(&limitedLength, sizeof(limitedLength)); Write(&limitedLength, sizeof(limitedLength));
Write((char*) data, (LegoS16) fullLength); Write((char*) data, (LegoS16) fullLength);

View File

@ -1,5 +1,7 @@
#include "legounknown.h" #include "legounknown.h"
#include "mxgeometry/mxmatrix.h"
DECOMP_SIZE_ASSERT(LegoUnknown, 0x50) DECOMP_SIZE_ASSERT(LegoUnknown, 0x50)
// FUNCTION: LEGO1 0x1009a0f0 // FUNCTION: LEGO1 0x1009a0f0
@ -29,7 +31,7 @@ void LegoUnknown::FUN_1009a140(const Vector3& p_point1, Vector3& p_point2, Vecto
// FUNCTION: LEGO1 0x1009a1e0 // FUNCTION: LEGO1 0x1009a1e0
// FUNCTION: BETA10 0x10182d61 // FUNCTION: BETA10 0x10182d61
LegoResult LegoUnknown::FUN_1009a1e0(float p_f1, Matrix4& p_mat, Vector3& p_v, LegoU32 p_und) LegoResult LegoUnknown::FUN_1009a1e0(float p_f1, MxMatrix& p_mat, Vector3& p_v, LegoU32 p_und)
{ {
Vector3 v1(p_mat[3]); Vector3 v1(p_mat[3]);
Vector3 v2(p_mat[0]); Vector3 v2(p_mat[0]);
@ -68,11 +70,11 @@ LegoResult LegoUnknown::FUN_1009a1e0(float p_f1, Matrix4& p_mat, Vector3& p_v, L
return FAILURE; return FAILURE;
} }
v2.EqualsCross(&p_v, &v4); v2.EqualsCross(p_v, v4);
if (v2.Unitize() != 0) { if (v2.Unitize() != 0) {
return FAILURE; return FAILURE;
} }
v3.EqualsCross(&v4, &v2); v3.EqualsCross(v4, v2);
return SUCCESS; return SUCCESS;
} }

View File

@ -4,7 +4,7 @@
#include "legotypes.h" #include "legotypes.h"
#include "mxgeometry/mxgeometry3d.h" #include "mxgeometry/mxgeometry3d.h"
class Matrix4; class MxMatrix;
// SIZE 0x50 // SIZE 0x50
class LegoUnknown { class LegoUnknown {
@ -13,7 +13,7 @@ class LegoUnknown {
~LegoUnknown(); ~LegoUnknown();
void FUN_1009a140(const Vector3& p_point1, Vector3& p_point2, Vector3& p_point3, Vector3& p_point4); void FUN_1009a140(const Vector3& p_point1, Vector3& p_point2, Vector3& p_point3, Vector3& p_point4);
LegoResult FUN_1009a1e0(float p_f1, Matrix4& p_mat, Vector3& p_v, LegoU32 p_und); LegoResult FUN_1009a1e0(float p_f1, MxMatrix& p_mat, Vector3& p_v, LegoU32 p_und);
private: private:
Mx3DPointFloat m_unk0x00[4]; // 0x00 Mx3DPointFloat m_unk0x00[4]; // 0x00

View File

@ -4,6 +4,7 @@
#include "legolod.h" #include "legolod.h"
#include "misc/legocontainer.h" #include "misc/legocontainer.h"
#include "misc/legostorage.h" #include "misc/legostorage.h"
#include "mxgeometry/mxgeometry4d.h"
#include "realtime/realtime.h" #include "realtime/realtime.h"
#include "shape/legobox.h" #include "shape/legobox.h"
#include "shape/legosphere.h" #include "shape/legosphere.h"
@ -626,13 +627,13 @@ LegoU32 LegoROI::FUN_100a9410(
local38 *= 0.5f; local38 *= 0.5f;
local70 = localc0; local70 = localc0;
localc0.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); localc0.SetMatrixProduct(local70, (float*) m_local2world.GetData());
local70 = local9c; local70 = local9c;
local9c.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); local9c.SetMatrixProduct(local70, (float*) m_local2world.GetData());
local70 = local168; local70 = local168;
local168.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); local168.SetMatrixProduct(local70, (float*) m_local2world.GetData());
p_v3 = m_local2world[3]; p_v3 = m_local2world[3];
@ -641,22 +642,22 @@ LegoU32 LegoROI::FUN_100a9410(
local150[i] = m_local2world[i % 3]; local150[i] = m_local2world[i % 3];
if (i > 2) { if (i > 2) {
local150[i][3] = -local58.Dot(&local58, &local150[i]); local150[i][3] = -local58.Dot(local58, local150[i]);
} }
else { else {
local150[i][3] = -locala8.Dot(&locala8, &local150[i]); local150[i][3] = -locala8.Dot(locala8, local150[i]);
} }
if (local150[i][3] + local38.Dot(&local38, &local150[i]) < 0.0f) { if (local150[i][3] + local38.Dot(local38, local150[i]) < 0.0f) {
local150[i] *= -1.0f; local150[i] *= -1.0f;
} }
} }
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
float local50 = p_v2.Dot(&p_v2, &local150[i]); float local50 = p_v2.Dot(p_v2, local150[i]);
if (local50 >= 0.01 || local50 < -0.01) { if (local50 >= 0.01 || local50 < -0.01) {
local50 = -((local150[i][3] + local4c.Dot(&local4c, &local150[i])) / local50); local50 = -((local150[i][3] + local4c.Dot(local4c, local150[i])) / local50);
if (local50 >= 0.0f && local50 <= p_f1) { if (local50 >= 0.0f && local50 <= p_f1) {
Mx3DPointFloat local17c(p_v2); Mx3DPointFloat local17c(p_v2);
@ -666,7 +667,7 @@ LegoU32 LegoROI::FUN_100a9410(
LegoS32 j; LegoS32 j;
for (j = 0; j < 6; j++) { for (j = 0; j < 6; j++) {
if (i != j && i - j != 3 && j - i != 3) { if (i != j && i - j != 3 && j - i != 3) {
if (local150[j][3] + local17c.Dot(&local17c, &local150[j]) < 0.0f) { if (local150[j][3] + local17c.Dot(local17c, local150[j]) < 0.0f) {
break; break;
} }
} }
@ -684,9 +685,9 @@ LegoU32 LegoROI::FUN_100a9410(
v1 -= GetWorldBoundingSphere().Center(); v1 -= GetWorldBoundingSphere().Center();
float local10 = GetWorldBoundingSphere().Radius(); float local10 = GetWorldBoundingSphere().Radius();
float local8 = p_v2.Dot(&p_v2, &p_v2); float local8 = p_v2.Dot(p_v2, p_v2);
float localc = p_v2.Dot(&p_v2, &v1) * 2.0f; float localc = p_v2.Dot(p_v2, v1) * 2.0f;
float local14 = v1.Dot(&v1, &v1) - (local10 * local10); float local14 = v1.Dot(v1, v1) - (local10 * local10);
if (local8 >= 0.001 || local8 <= -0.001) { if (local8 >= 0.001 || local8 <= -0.001) {
float local1c = -1.0f; float local1c = -1.0f;

View File

@ -639,6 +639,15 @@
// GLOBAL: LEGO1 0x101028da // GLOBAL: LEGO1 0x101028da
// __OP_POWjmptab // __OP_POWjmptab
// GLOBAL: LEGO1 0x1010292a
// __OP_LOG10jmptab
// GLOBAL: LEGO1 0x1010294a
// __OP_LOGjmptab
// GLOBAL: LEGO1 0x1010296a
// __OP_EXPjmptab
// GLOBAL: LEGO1 0x101095f8 // GLOBAL: LEGO1 0x101095f8
// __crtheap // __crtheap
@ -675,6 +684,9 @@
// LIBRARY: BETA10 0x100f9a50 // LIBRARY: BETA10 0x100f9a50
// _sin // _sin
// LIBRARY: BETA10 0x100f9a5a
// _cos
// LIBRARY: BETA10 0x100f95d0 // LIBRARY: BETA10 0x100f95d0
// _sqrt // _sqrt

View File

@ -12,6 +12,13 @@
// LIBRARY: BETA10 0x1015fe83 // LIBRARY: BETA10 0x1015fe83
// _SmackDoFrameToBuffer // _SmackDoFrameToBuffer
// LIBRARY: LEGO1 0x100cea58
// LIBRARY: BETA10 0x10160e58
// _SmackDoFrameToVESA
// LIBRARY: LEGO1 0x100cfd90
// _SmackDoPCM
// LIBRARY: LEGO1 0x100d052c // LIBRARY: LEGO1 0x100d052c
// LIBRARY: BETA10 0x1016292c // LIBRARY: BETA10 0x1016292c
// _SmackGetSizeDeltas // _SmackGetSizeDeltas
@ -20,4 +27,7 @@
// LIBRARY: BETA10 0x10162943 // LIBRARY: BETA10 0x10162943
// _SmackGetRect // _SmackGetRect
// LIBRARY: LEGO1 0x100d0654
// _SmackRemapTables
#endif #endif

View File

@ -2,8 +2,7 @@
#define MXGEOMETRY3D_H #define MXGEOMETRY3D_H
#include "decomp.h" #include "decomp.h"
#include "realtime/matrix.h" #include "realtime/vector3d.inl.h"
#include "realtime/vector.h"
// VTABLE: LEGO1 0x100d4488 // VTABLE: LEGO1 0x100d4488
// VTABLE: BETA10 0x101b84d0 // VTABLE: BETA10 0x101b84d0
@ -53,199 +52,4 @@ class Mx3DPointFloat : public Vector3 {
float m_elements[3]; // 0x08 float m_elements[3]; // 0x08
}; };
// VTABLE: LEGO1 0x100d41e8
// VTABLE: BETA10 0x101bab78
// SIZE 0x18
class Mx4DPointFloat : public Vector4 {
public:
// FUNCTION: LEGO1 0x10048290
// FUNCTION: BETA10 0x100484c0
Mx4DPointFloat() : Vector4(m_elements) {}
// FUNCTION: BETA10 0x10073bb0
Mx4DPointFloat(float p_x, float p_y, float p_z, float p_a) : Vector4(m_elements)
{
m_elements[0] = p_x;
m_elements[1] = p_y;
m_elements[2] = p_z;
m_elements[3] = p_a;
}
Mx4DPointFloat(const Mx4DPointFloat& p_other) : Vector4(m_elements) { EqualsImpl(p_other.m_data); }
// FUNCTION: LEGO1 0x10003200
virtual void operator=(const Vector4& p_impl) { EqualsImpl(p_impl.m_data); } // vtable+0x98
// FUNCTION: BETA10 0x1004af10
float& operator[](int idx) { return m_data[idx]; }
// According to the PDB, BETA10 will not link this one if it is never used
// const float& operator[](int idx) const { return m_data[idx]; }
// only used by a couple of BETA10 functions for some unknown reason
// FUNCTION: BETA10 0x1001c950
float& index_operator(int idx) { return m_data[idx]; }
// SYNTHETIC: LEGO1 0x10064b20
// SYNTHETIC: BETA10 0x10070420
// ??4Mx4DPointFloat@@QAEAAV0@ABV0@@Z
private:
float m_elements[4]; // 0x08
};
// SIZE 0x34
class UnknownMx4DPointFloat {
public:
enum {
c_bit1 = 0x01,
c_bit2 = 0x02
};
UnknownMx4DPointFloat() : m_unk0x30(0) {}
// FUNCTION: BETA10 0x1004a9b0
void BETA_1004a9b0(Matrix4& p_m1, Matrix4& p_m2)
{
BETA_1004a9f0(p_m1);
FUN_10004620(p_m2);
}
// FUNCTION: BETA10 0x1004a9f0
void BETA_1004a9f0(Matrix4& p_m)
{
p_m.ToQuaternion(m_unk0x00);
m_unk0x30 |= c_bit1;
}
// FUNCTION: LEGO1 0x10004620
// FUNCTION: BETA10 0x1004aa30
void FUN_10004620(Matrix4& p_m)
{
p_m.ToQuaternion(m_unk0x18);
m_unk0x30 |= c_bit2;
}
// FUNCTION: BETA10 0x10180b80
void BETA_10180b80(Vector4& p_v)
{
m_unk0x00 = p_v;
m_unk0x30 |= c_bit1;
}
// FUNCTION: BETA10 0x10180bc0
void BETA_10180bc0(Vector4& p_v)
{
m_unk0x18 = p_v;
m_unk0x30 |= c_bit2;
}
const Vector4& GetUnknown0x00() const { return m_unk0x00; }
const Vector4& GetUnknown0x18() const { return m_unk0x18; }
undefined4 GetUnknown0x30() const { return m_unk0x30; }
inline int BETA_1004aaa0(Matrix4& p_matrix, float p_f);
inline long FUN_10004520();
private:
inline int FUN_100040a0(Vector4& p_v, float p_f);
Mx4DPointFloat m_unk0x00; // 0x00
Mx4DPointFloat m_unk0x18; // 0x18
undefined4 m_unk0x30; // 0x30
};
// FUNCTION: BETA10 0x1004aaa0
inline int UnknownMx4DPointFloat::BETA_1004aaa0(Matrix4& p_matrix, float p_f)
{
float data[4];
Vector4 v(data);
if (FUN_100040a0(v, p_f) == 0) {
return p_matrix.FromQuaternion(v);
}
else {
return -1;
}
}
// FUNCTION: LEGO1 0x10004520
inline long UnknownMx4DPointFloat::FUN_10004520()
{
if (!m_unk0x30) {
return -1;
}
Mx4DPointFloat v1;
Mx4DPointFloat v2;
v1 = m_unk0x00;
v1 += m_unk0x18;
v2 = m_unk0x00;
v2 -= m_unk0x18;
if (v1.Dot(&v1, &v1) < v2.Dot(&v2, &v2)) {
m_unk0x18 *= -1.0f;
}
return 0;
}
// FUNCTION: LEGO1 0x100040a0
// FUNCTION: BETA10 0x1004ab10
inline int UnknownMx4DPointFloat::FUN_100040a0(Vector4& p_v, float p_f)
{
if (m_unk0x30 == c_bit1) {
p_v = m_unk0x00;
p_v[3] = (1.0 - p_f) * acos((double) p_v[3]) * 2.0;
return p_v.NormalizeQuaternion();
}
else if (m_unk0x30 == c_bit2) {
p_v = m_unk0x18;
p_v[3] = p_f * acos((double) p_v[3]) * 2.0;
return p_v.NormalizeQuaternion();
}
else if (m_unk0x30 == (c_bit1 | c_bit2)) {
int i;
double d1 = p_v.Dot(&m_unk0x00, &m_unk0x18);
double a;
double b;
if (d1 + 1.0 > 0.00001) {
if (1.0 - d1 > 0.00001) {
double d2 = acos(d1);
double denominator = sin(d2);
a = sin((1.0 - p_f) * d2) / denominator;
b = sin(p_f * d2) / denominator;
}
else {
a = 1.0 - p_f;
b = p_f;
}
for (i = 0; i < 4; i++) {
p_v[i] = m_unk0x00[i] * a + m_unk0x18[i] * b;
}
}
else {
p_v[0] = -m_unk0x00[1];
p_v[1] = m_unk0x00[0];
p_v[2] = -m_unk0x00[3];
p_v[3] = m_unk0x00[2];
a = sin((1.0 - p_f) * 1.570796326794895);
b = sin(p_f * 1.570796326794895);
for (i = 0; i < 3; i++) {
p_v[i] = m_unk0x00[i] * a + p_v[i] * b;
}
}
return 0;
}
else {
return -1;
}
}
#endif // MXGEOMETRY3D_H #endif // MXGEOMETRY3D_H

View File

@ -0,0 +1,48 @@
#ifndef MXGEOMETRY4D_H
#define MXGEOMETRY4D_H
#include "decomp.h"
#include "realtime/vector4d.inl.h"
// VTABLE: LEGO1 0x100d41e8
// VTABLE: BETA10 0x101bab78
// SIZE 0x18
class Mx4DPointFloat : public Vector4 {
public:
// FUNCTION: LEGO1 0x10048290
// FUNCTION: BETA10 0x100484c0
Mx4DPointFloat() : Vector4(m_elements) {}
// FUNCTION: BETA10 0x10073bb0
Mx4DPointFloat(float p_x, float p_y, float p_z, float p_a) : Vector4(m_elements)
{
m_elements[0] = p_x;
m_elements[1] = p_y;
m_elements[2] = p_z;
m_elements[3] = p_a;
}
Mx4DPointFloat(const Mx4DPointFloat& p_other) : Vector4(m_elements) { EqualsImpl(p_other.m_data); }
// FUNCTION: LEGO1 0x10003200
virtual void operator=(const Vector4& p_impl) { EqualsImpl(p_impl.m_data); } // vtable+0x98
// FUNCTION: BETA10 0x1004af10
float& operator[](int idx) { return m_data[idx]; }
// According to the PDB, BETA10 will not link this one if it is never used
// const float& operator[](int idx) const { return m_data[idx]; }
// only used by a couple of BETA10 functions for some unknown reason
// FUNCTION: BETA10 0x1001c950
float& index_operator(int idx) { return m_data[idx]; }
// SYNTHETIC: LEGO1 0x10064b20
// SYNTHETIC: BETA10 0x10070420
// ??4Mx4DPointFloat@@QAEAAV0@ABV0@@Z
private:
float m_elements[4]; // 0x08
};
#endif // MXGEOMETRY4D_H

View File

@ -1,7 +1,7 @@
#ifndef MXMATRIX_H #ifndef MXMATRIX_H
#define MXMATRIX_H #define MXMATRIX_H
#include "realtime/matrix.h" #include "realtime/matrix4d.inl.h"
// VTABLE: LEGO1 0x100d4300 // VTABLE: LEGO1 0x100d4300
// VTABLE: BETA10 0x101b82e0 // VTABLE: BETA10 0x101b82e0
@ -35,4 +35,9 @@ class MxMatrix : public Matrix4 {
float m_elements[4][4]; // 0x08 float m_elements[4][4]; // 0x08
}; };
// Must be included here (not before MxMatrix) for correct ordering in binary.
// FromQuaternion and ToQuaternion in Matrix4 depend on Vector4.
// There's a chance they included mxgeometry4d.h after including this somewhere.
#include "realtime/vector4d.inl.h"
#endif // MXMATRIX_H #endif // MXMATRIX_H

View File

@ -0,0 +1,165 @@
#ifndef MXQUATERNION_H
#define MXQUATERNION_H
#include "mxgeometry4d.h"
// SIZE 0x34
class MxQuaternionTransformer {
public:
enum {
c_startSet = 0x01,
c_endSet = 0x02
};
MxQuaternionTransformer() : m_flags(0) {}
inline long NormalizeDirection();
inline void SetStartEnd(Matrix4& p_m1, Matrix4& p_m2);
inline void SetStart(Matrix4& p_m);
inline void SetEnd(Matrix4& p_m);
inline void SetStart(Vector4& p_v);
inline void SetEnd(Vector4& p_v);
inline int InterpolateToMatrix(Matrix4& p_matrix, float p_f);
const Vector4& GetStartQuat() const { return m_startQuat; }
const Vector4& GetEndQuat() const { return m_endQuat; }
undefined4 GetFlags() const { return m_flags; }
private:
inline int Interpolate(Vector4& p_v, float p_f);
Mx4DPointFloat m_startQuat; // 0x00
Mx4DPointFloat m_endQuat; // 0x18
MxU32 m_flags; // 0x30
};
// FUNCTION: LEGO1 0x10004520
long MxQuaternionTransformer::NormalizeDirection()
{
if (!m_flags) {
return -1;
}
Mx4DPointFloat v1;
Mx4DPointFloat v2;
v1 = m_startQuat;
v1 += m_endQuat;
v2 = m_startQuat;
v2 -= m_endQuat;
if (v1.Dot(v1, v1) < v2.Dot(v2, v2)) {
m_endQuat *= -1.0f;
}
return 0;
}
// FUNCTION: BETA10 0x1004a9b0
void MxQuaternionTransformer::SetStartEnd(Matrix4& p_m1, Matrix4& p_m2)
{
SetStart(p_m1);
SetEnd(p_m2);
}
// FUNCTION: BETA10 0x1004a9f0
void MxQuaternionTransformer::SetStart(Matrix4& p_m)
{
p_m.ToQuaternion(m_startQuat);
m_flags |= c_startSet;
}
// FUNCTION: LEGO1 0x10004620
// FUNCTION: BETA10 0x1004aa30
void MxQuaternionTransformer::SetEnd(Matrix4& p_m)
{
p_m.ToQuaternion(m_endQuat);
m_flags |= c_endSet;
}
// FUNCTION: BETA10 0x10180b80
void MxQuaternionTransformer::SetStart(Vector4& p_v)
{
m_startQuat = p_v;
m_flags |= c_startSet;
}
// FUNCTION: BETA10 0x10180bc0
void MxQuaternionTransformer::SetEnd(Vector4& p_v)
{
m_endQuat = p_v;
m_flags |= c_endSet;
}
// FUNCTION: BETA10 0x1004aaa0
int MxQuaternionTransformer::InterpolateToMatrix(Matrix4& p_matrix, float p_f)
{
float data[4];
Vector4 v(data);
if (Interpolate(v, p_f) == 0) {
return p_matrix.FromQuaternion(v);
}
return -1;
}
// FUNCTION: LEGO1 0x100040a0
// FUNCTION: BETA10 0x1004ab10
int MxQuaternionTransformer::Interpolate(Vector4& p_v, float p_f)
{
if (m_flags == c_startSet) {
p_v = m_startQuat;
p_v[3] = (float) ((1.0 - p_f) * acos((double) p_v[3]) * 2.0);
return p_v.NormalizeQuaternion();
}
if (m_flags == c_endSet) {
p_v = m_endQuat;
p_v[3] = (float) (p_f * acos((double) p_v[3]) * 2.0);
return p_v.NormalizeQuaternion();
}
if (m_flags == (c_startSet | c_endSet)) {
int i;
double d1 = p_v.Dot(m_startQuat, m_endQuat);
double a;
double b;
if (d1 + 1.0 > 0.00001) {
if (1.0 - d1 > 0.00001) {
double d2 = acos(d1);
double denominator = sin(d2);
a = sin((1.0 - p_f) * d2) / denominator;
b = sin(p_f * d2) / denominator;
}
else {
a = 1.0 - p_f;
b = p_f;
}
for (i = 0; i < 4; i++) {
p_v[i] = (float) (m_startQuat[i] * a + m_endQuat[i] * b);
}
}
else {
p_v[0] = -m_startQuat[1];
p_v[1] = m_startQuat[0];
p_v[2] = -m_startQuat[3];
p_v[3] = m_startQuat[2];
a = sin((1.0 - p_f) * 1.570796326794895);
b = sin(p_f * 1.570796326794895);
for (i = 0; i < 3; i++) {
p_v[i] = (float) (m_startQuat[i] * a + p_v[i] * b);
}
}
return 0;
}
return -1;
}
#endif // MXQUATERNION_H

View File

@ -10,6 +10,12 @@ class MxAudioPresenter : public MxMediaPresenter {
public: public:
MxAudioPresenter() { m_volume = 100; } MxAudioPresenter() { m_volume = 100; }
// FUNCTION: LEGO1 0x1000d260
virtual MxS32 GetVolume() { return m_volume; } // vtable+0x5c
// FUNCTION: LEGO1 0x1000d270
virtual void SetVolume(MxS32 p_volume) { m_volume = p_volume; } // vtable+0x60
// FUNCTION: BETA10 0x1008cba0 // FUNCTION: BETA10 0x1008cba0
static const char* HandlerClassName() static const char* HandlerClassName()
{ {
@ -30,12 +36,6 @@ class MxAudioPresenter : public MxMediaPresenter {
return !strcmp(p_name, MxAudioPresenter::ClassName()) || MxMediaPresenter::IsA(p_name); return !strcmp(p_name, MxAudioPresenter::ClassName()) || MxMediaPresenter::IsA(p_name);
} }
// FUNCTION: LEGO1 0x1000d260
virtual MxS32 GetVolume() { return m_volume; } // vtable+0x5c
// FUNCTION: LEGO1 0x1000d270
virtual void SetVolume(MxS32 p_volume) { m_volume = p_volume; } // vtable+0x60
protected: protected:
MxS32 m_volume; // 0x50 MxS32 m_volume; // 0x50
}; };

View File

@ -90,7 +90,7 @@ class MxBitmap : public MxCore {
// DECOMP: This could be a free function. It is static here because it has no // DECOMP: This could be a free function. It is static here because it has no
// reference to "this". In the beta it is called in two places: // reference to "this". In the beta it is called in two places:
// 1. GetBmiHeightAbs // 1. GetBmiHeightAbs
// 2. MxSmack::LoadFrame // 2. MxSmk::LoadFrame
// FUNCTION: BETA10 0x1002c690 // FUNCTION: BETA10 0x1002c690
static MxLong HeightAbs(MxLong p_value) { return p_value > 0 ? p_value : -p_value; } static MxLong HeightAbs(MxLong p_value) { return p_value > 0 ? p_value : -p_value; }

View File

@ -97,4 +97,7 @@ class MxDiskStreamController : public MxStreamController {
// TEMPLATE: BETA10 0x10150e60 // TEMPLATE: BETA10 0x10150e60
// MxUtilityList<MxNextActionDataStart *>::PushBack // MxUtilityList<MxNextActionDataStart *>::PushBack
// TEMPLATE: BETA10 0x10150ff0
// MxUtilityList<MxDSObject *>::PushBack
#endif // MXDISKSTREAMCONTROLLER_H #endif // MXDISKSTREAMCONTROLLER_H

View File

@ -68,7 +68,7 @@ class MxDSBuffer : public MxCore {
// FUNCTION: BETA10 0x10148c60 // FUNCTION: BETA10 0x10148c60
MxU8* GetBuffer() { return m_pBuffer; } MxU8* GetBuffer() { return m_pBuffer; }
MxU8** GetBufferRef() { return &m_pBuffer; } // FUNCTION: BETA10 0x10164240
undefined4 GetUnknown14() { return m_unk0x14; } undefined4 GetUnknown14() { return m_unk0x14; }
// FUNCTION: BETA10 0x10156420 // FUNCTION: BETA10 0x10156420
@ -85,7 +85,10 @@ class MxDSBuffer : public MxCore {
void SetUnknown14(undefined4 p_unk0x14) { m_unk0x14 = p_unk0x14; } void SetUnknown14(undefined4 p_unk0x14) { m_unk0x14 = p_unk0x14; }
void SetUnknown1c(undefined4 p_unk0x1c) { m_unk0x1c = p_unk0x1c; } void SetUnknown1c(undefined4 p_unk0x1c) { m_unk0x1c = p_unk0x1c; }
// FUNCTION: BETA10 0x10164260
void SetMode(Type p_mode) { m_mode = p_mode; } void SetMode(Type p_mode) { m_mode = p_mode; }
void SetUnk30(MxDSStreamingAction* p_unk0x30) { m_unk0x30 = p_unk0x30; } void SetUnk30(MxDSStreamingAction* p_unk0x30) { m_unk0x30 = p_unk0x30; }
// SYNTHETIC: LEGO1 0x100c6510 // SYNTHETIC: LEGO1 0x100c6510

View File

@ -35,10 +35,12 @@ class MxDSChunk : public MxCore {
} }
static MxU32 GetHeaderSize(); static MxU32 GetHeaderSize();
static MxU32* IntoType(MxU8* p_buffer) { return (MxU32*) p_buffer; }
static MxU32* IntoLength(MxU8* p_buffer) { return (MxU32*) (p_buffer + 4); } // FUNCTION: BETA10 0x101641f0
static MxU32 Size(MxU32 p_dataSize) { return (p_dataSize & 1) + p_dataSize + 8; } static MxU32 Size(MxU8* p_buffer) { return (*(MxU32*) (p_buffer + 4) & 1) + *(MxU32*) (p_buffer + 4) + 8; }
static MxU8* End(MxU8* p_buffer) { return p_buffer + Size(*IntoLength(p_buffer)); }
// FUNCTION: BETA10 0x10164220
static MxU8* End(MxU8* p_buffer) { return p_buffer + Size(p_buffer); }
void SetChunkFlags(MxU16 p_flags) { m_flags = p_flags; } void SetChunkFlags(MxU16 p_flags) { m_flags = p_flags; }
void SetObjectId(undefined4 p_objectid) { m_objectId = p_objectid; } void SetObjectId(undefined4 p_objectid) { m_objectId = p_objectid; }

View File

@ -6,6 +6,7 @@
class MxDSBuffer; class MxDSBuffer;
// VTABLE: LEGO1 0x100dd088 // VTABLE: LEGO1 0x100dd088
// VTABLE: BETA10 0x101c2850
// SIZE 0xb4 // SIZE 0xb4
class MxDSStreamingAction : public MxDSAction { class MxDSStreamingAction : public MxDSAction {
public: public:
@ -14,40 +15,53 @@ class MxDSStreamingAction : public MxDSAction {
~MxDSStreamingAction() override; ~MxDSStreamingAction() override;
MxDSStreamingAction* CopyFrom(MxDSStreamingAction& p_dsStreamingAction); MxDSStreamingAction* CopyFrom(MxDSStreamingAction& p_dsStreamingAction);
MxDSStreamingAction& operator=(MxDSAction& p_dsAction)
{
MxDSAction::operator=(p_dsAction);
return *this;
}
MxDSStreamingAction& operator=(MxDSStreamingAction& p_dsStreamingAction)
{
MxDSAction::operator=(p_dsStreamingAction);
return *this;
}
MxBool HasId(MxU32 p_objectId) override; // vtable+34; MxBool HasId(MxU32 p_objectId) override; // vtable+0x34;
MxResult Init(); void Init();
void SetInternalAction(MxDSAction* p_dsAction); void SetInternalAction(MxDSAction* p_dsAction);
void FUN_100cd2d0(); void FUN_100cd2d0();
// FUNCTION: BETA10 0x10156530
MxU32 GetUnknown94() { return m_unk0x94; } MxU32 GetUnknown94() { return m_unk0x94; }
// FUNCTION: BETA10 0x10156380
MxS32 GetUnknown9c() { return m_unk0x9c; } MxS32 GetUnknown9c() { return m_unk0x9c; }
// FUNCTION: BETA10 0x10156630
MxDSBuffer* GetUnknowna0() { return m_unk0xa0; } MxDSBuffer* GetUnknowna0() { return m_unk0xa0; }
// FUNCTION: BETA10 0x101563d0
MxDSBuffer* GetUnknowna4() { return m_unk0xa4; } MxDSBuffer* GetUnknowna4() { return m_unk0xa4; }
// FUNCTION: BETA10 0x10159190
MxLong GetUnknowna8() { return m_unk0xa8; } MxLong GetUnknowna8() { return m_unk0xa8; }
MxDSAction* GetInternalAction() { return m_internalAction; } MxDSAction* GetInternalAction() { return m_internalAction; }
// FUNCTION: BETA10 0x10156580
MxU32 GetBufferOffset() { return m_bufferOffset; } MxU32 GetBufferOffset() { return m_bufferOffset; }
// FUNCTION: BETA10 0x10156550
void SetUnknown94(MxU32 p_unk0x94) { m_unk0x94 = p_unk0x94; } void SetUnknown94(MxU32 p_unk0x94) { m_unk0x94 = p_unk0x94; }
// FUNCTION: BETA10 0x101563a0
void SetUnknown9c(MxS32 p_unk0x9c) { m_unk0x9c = p_unk0x9c; } void SetUnknown9c(MxS32 p_unk0x9c) { m_unk0x9c = p_unk0x9c; }
// FUNCTION: BETA10 0x10156470
void SetUnknowna0(MxDSBuffer* p_unk0xa0) { m_unk0xa0 = p_unk0xa0; } void SetUnknowna0(MxDSBuffer* p_unk0xa0) { m_unk0xa0 = p_unk0xa0; }
// FUNCTION: BETA10 0x101563f0
void SetUnknowna4(MxDSBuffer* p_unk0xa4) { m_unk0xa4 = p_unk0xa4; } void SetUnknowna4(MxDSBuffer* p_unk0xa4) { m_unk0xa4 = p_unk0xa4; }
// FUNCTION: BETA10 0x10151150
void SetBufferOffset(MxU32 p_bufferOffset) { m_bufferOffset = p_bufferOffset; } void SetBufferOffset(MxU32 p_bufferOffset) { m_bufferOffset = p_bufferOffset; }
// FUNCTION: BETA10 0x10156650 // FUNCTION: BETA10 0x10156650
void ClearUnknowna0() { m_unk0xa0 = NULL; } void ClearUnknowna0() { m_unk0xa0 = NULL; }
// SYNTHETIC: LEGO1 0x100cd0b0 // SYNTHETIC: LEGO1 0x100cd0b0
// SYNTHETIC: BETA10 0x101565f0
// MxDSStreamingAction::`scalar deleting destructor' // MxDSStreamingAction::`scalar deleting destructor'
private: private:

View File

@ -29,6 +29,7 @@ class MXIOINFO {
MxU16 Advance(MxU16); MxU16 Advance(MxU16);
MxU16 Descend(MMCKINFO*, const MMCKINFO*, MxU16); MxU16 Descend(MMCKINFO*, const MMCKINFO*, MxU16);
MxU16 Ascend(MMCKINFO*, MxU16); MxU16 Ascend(MMCKINFO*, MxU16);
MxU16 CreateChunk(MMCKINFO* p_chunkInfo, MxU16 p_create);
// NOTE: In MXIOINFO, the `hmmio` member of MMIOINFO is used like // NOTE: In MXIOINFO, the `hmmio` member of MMIOINFO is used like
// an HFILE (int) instead of an HMMIO (WORD). // an HFILE (int) instead of an HMMIO (WORD).

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