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}")
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/texture.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})
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)
add_library(realtime${ARG_SUFFIX} STATIC
LEGO1/realtime/matrix.cpp
LEGO1/realtime/orientableroi.cpp
LEGO1/realtime/realtime.cpp
LEGO1/realtime/realtimeview.cpp
LEGO1/realtime/vector.cpp
)
list(APPEND list_targets realtime${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
LEGO1/viewmanager/viewlod.cpp
LEGO1/viewmanager/viewlodlist.cpp
LEGO1/viewmanager/viewmanager.cpp
LEGO1/viewmanager/viewlodlist.cpp
LEGO1/viewmanager/viewroi.cpp
)
list(APPEND list_targets viewmanager${ARG_SUFFIX})
@ -134,9 +132,9 @@ function(add_lego_libraries NAME)
add_library(mxdirectx${ARG_SUFFIX} STATIC
LEGO1/mxdirectx/mxdirect3d.cpp
LEGO1/mxdirectx/mxdirectdraw.cpp
LEGO1/mxdirectx/mxdirectxinfo.cpp
LEGO1/mxdirectx/legodxinfo.cpp
LEGO1/mxdirectx/mxdirectdraw.cpp
)
list(APPEND list_targets mxdirectx${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)
add_library(roi${ARG_SUFFIX} STATIC
LEGO1/lego/sources/roi/legolod.cpp
LEGO1/lego/sources/roi/legoroi.cpp
LEGO1/lego/sources/roi/legolod.cpp
)
list(APPEND list_targets roi${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
LEGO1/lego/sources/geom/legoedge.cpp
LEGO1/lego/sources/geom/legounkown100db7f4.cpp
LEGO1/lego/sources/geom/legoweedge.cpp
LEGO1/lego/sources/geom/legounkown100db7f4.cpp
LEGO1/lego/sources/geom/legowegedge.cpp
)
list(APPEND list_targets geom${ARG_SUFFIX})
@ -164,11 +162,11 @@ function(add_lego_libraries NAME)
target_link_libraries(geom${ARG_SUFFIX} PRIVATE)
add_library(shape${ARG_SUFFIX} STATIC
LEGO1/lego/sources/shape/legocolor.cpp
LEGO1/lego/sources/shape/legobox.cpp
LEGO1/lego/sources/shape/legomesh.cpp
LEGO1/lego/sources/shape/legosphere.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})
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")
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/legostorage.cpp
LEGO1/lego/sources/misc/legoimage.cpp
LEGO1/lego/sources/misc/legocontainer.cpp
LEGO1/lego/sources/misc/legotree.cpp
LEGO1/lego/sources/misc/legounknown.cpp
)
@ -196,8 +194,8 @@ function(add_lego_libraries NAME)
target_link_libraries(misc${ARG_SUFFIX} PRIVATE)
add_library(3dmanager${ARG_SUFFIX} STATIC
LEGO1/lego/sources/3dmanager/lego3dmanager.cpp
LEGO1/lego/sources/3dmanager/lego3dview.cpp
LEGO1/lego/sources/3dmanager/lego3dmanager.cpp
LEGO1/lego/sources/3dmanager/legoview1.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)
add_library(omni${ARG_SUFFIX} STATIC
LEGO1/omni/src/action/mxdsaction.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/notify/mxnotificationmanager.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/mxobjectfactory.cpp
LEGO1/omni/src/common/mxpresenter.cpp
LEGO1/omni/src/common/mxstring.cpp
LEGO1/omni/src/common/mxticklemanager.cpp
LEGO1/omni/src/common/mxatom.cpp
LEGO1/omni/src/action/mxdsaction.cpp
LEGO1/omni/src/common/mxtimer.cpp
LEGO1/omni/src/common/mxutilities.cpp
LEGO1/omni/src/common/mxvariable.cpp
LEGO1/omni/src/common/mxvariabletable.cpp
LEGO1/omni/src/entity/mxentity.cpp
LEGO1/omni/src/event/mxeventmanager.cpp
LEGO1/omni/src/event/mxeventpresenter.cpp
LEGO1/omni/src/common/mxcore.cpp
LEGO1/omni/src/common/mxstring.cpp
LEGO1/omni/src/audio/mxsoundmanager.cpp
LEGO1/omni/src/main/mxomni.cpp
LEGO1/omni/src/notify/mxactionnotificationparam.cpp
LEGO1/omni/src/main/mxomnicreateflags.cpp
LEGO1/omni/src/main/mxomnicreateparam.cpp
LEGO1/omni/src/notify/mxactionnotificationparam.cpp
LEGO1/omni/src/notify/mxnotificationmanager.cpp
LEGO1/omni/src/notify/mxnotificationparam.cpp
LEGO1/omni/src/stream/mxdiskstreamcontroller.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/common/mxobjectfactory.cpp
LEGO1/omni/src/audio/mxsoundpresenter.cpp
LEGO1/omni/src/audio/mxwavepresenter.cpp
LEGO1/omni/src/video/mxvideopresenter.cpp
LEGO1/omni/src/video/mxflcpresenter.cpp
LEGO1/omni/src/video/mxsmkpresenter.cpp
LEGO1/omni/src/video/mxloopingflcpresenter.cpp
LEGO1/omni/src/video/mxloopingsmkpresenter.cpp
LEGO1/omni/src/video/mxpalette.cpp
LEGO1/omni/src/video/mxregion.cpp
LEGO1/omni/src/video/mxregioncursor.cpp
LEGO1/omni/src/video/mxsmack.cpp
LEGO1/omni/src/video/mxsmkpresenter.cpp
LEGO1/omni/src/common/mxpresenter.cpp
LEGO1/omni/src/common/mxmediapresenter.cpp
LEGO1/omni/src/common/mxcompositepresenter.cpp
LEGO1/omni/src/system/mxcriticalsection.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/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/mxvideoparam.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})
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)
add_library(${NAME} SHARED
LEGO1/define.cpp
LEGO1/lego/legoomni/src/actors/act2actor.cpp
LEGO1/lego/legoomni/src/actors/act2genactor.cpp
LEGO1/lego/legoomni/src/actors/act3actors.cpp
LEGO1/lego/legoomni/src/actors/act3ammo.cpp
LEGO1/lego/legoomni/src/actors/ambulance.cpp
LEGO1/lego/legoomni/src/actors/bike.cpp
LEGO1/lego/legoomni/src/worlds/score.cpp
LEGO1/lego/legoomni/src/actors/helicopter.cpp
LEGO1/lego/legoomni/src/worlds/gasstation.cpp
LEGO1/lego/legoomni/src/audio/legocachsound.cpp
LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
LEGO1/lego/legoomni/src/actors/skateboard.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/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/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/legoraceactor.cpp
LEGO1/lego/legoomni/src/race/legoracemap.cpp
LEGO1/lego/legoomni/src/race/legoracers.cpp
LEGO1/lego/legoomni/src/race/legoracespecial.cpp
LEGO1/lego/legoomni/src/race/raceskel.cpp
LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp
LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp
LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp
LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp
LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp
LEGO1/lego/legoomni/src/video/legopartpresenter.cpp
LEGO1/lego/legoomni/src/race/jetskirace.cpp
LEGO1/lego/legoomni/src/race/carrace.cpp
LEGO1/lego/legoomni/src/actors/pizzeria.cpp
LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp
LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp
LEGO1/lego/legoomni/src/actors/act2genactor.cpp
LEGO1/lego/legoomni/src/actors/act2actor.cpp
LEGO1/lego/legoomni/src/actors/islepathactor.cpp
LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
LEGO1/lego/legoomni/src/paths/legoanimactor.cpp
LEGO1/lego/legoomni/src/entity/legoworld.cpp
LEGO1/lego/legoomni/src/build/legocarbuild.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/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/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/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/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/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})
@ -430,20 +425,20 @@ function(add_lego_libraries NAME)
# Link libraries
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
dxguid
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}
omni${ARG_SUFFIX}
shape${ARG_SUFFIX}
Vec::Vec
dxguid
)
foreach(tgt IN LISTS list_targets)

View File

@ -19,13 +19,23 @@ class Act2Actor : public LegoAnimActor {
Act2Actor();
void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24
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
MxResult HitActor(LegoPathActor*, MxBool) override; // vtable+0x94
MxResult VTable0x9c() override; // vtable+0x9c
MxS32 VTable0xa0() override; // vtable+0xa0
void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24
void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
// FUNCTION: LEGO1 0x1001a180
MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) override
{
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_10019250(MxFloat p_speed, MxFloat p_param2);

View File

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

View File

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

View File

@ -5,80 +5,6 @@
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: BETA10 0x101bd610
// SIZE 0x68
@ -104,79 +30,6 @@ class InfoCenterEntity : public BuildingEntity {
// 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: BETA10 0x101bd6e0
// SIZE 0x68
@ -202,4 +55,151 @@ class GasStationEntity : public BuildingEntity {
// 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

View File

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

View File

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

View File

@ -3,7 +3,7 @@
#include "islepathactor.h"
#include "legostate.h"
#include "realtime/matrix.h"
#include "mxgeometry/mxquaternion.h"
class Act3;
@ -14,6 +14,16 @@ class HelicopterState : public LegoState {
public:
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: BETA10 0x100a7cc0
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);
}
// 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
// HelicopterState::`scalar deleting destructor'
// TODO: Most likely getters/setters are not used according to BETA.
MxU32 m_unk0x08; // 0x08
};
@ -93,12 +88,12 @@ class Helicopter : public IslePathActor {
protected:
void FUN_100042a0(const Matrix4& p_matrix);
MxMatrix m_unk0x160; // 0x160
MxMatrix m_unk0x1a8; // 0x1a8
float m_unk0x1f0; // 0x1f0
UnknownMx4DPointFloat m_unk0x1f4; // 0x1f4
HelicopterState* m_state; // 0x228
MxAtomId m_script; // 0x22c
MxMatrix m_unk0x160; // 0x160
MxMatrix m_unk0x1a8; // 0x1a8
float m_unk0x1f0; // 0x1f0
MxQuaternionTransformer m_unk0x1f4; // 0x1f4
HelicopterState* m_state; // 0x228
MxAtomId m_script; // 0x22c
};
#endif // HELICOPTER_H

View File

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

View File

@ -14,22 +14,7 @@ class MxNotificationParam;
// SIZE 0x7c
class IsleActor : public LegoActor {
public:
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);
}
MxLong Notify(MxParam& p_param) override; // vtable+0x04
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
// FUNCTION: LEGO1 0x1000e5f0
@ -53,6 +38,20 @@ class IsleActor : public LegoActor {
// FUNCTION: LEGO1 0x1000e650
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:
LegoWorld* m_world; // 0x78
};

View File

@ -86,6 +86,26 @@ class IslePathActor : public LegoPathActor {
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
~IslePathActor() override { IslePathActor::Destroy(TRUE); }
@ -108,29 +128,6 @@ class IslePathActor : public LegoPathActor {
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
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 Reset()
@ -143,6 +140,9 @@ class IslePathActor : public LegoPathActor {
static void RegisterSpawnLocations();
// SYNTHETIC: LEGO1 0x10002ff0
// IslePathActor::`scalar deleting destructor'
protected:
LegoWorld* m_world; // 0x154
LegoPathActor* m_previousActor; // 0x158

View File

@ -3,32 +3,6 @@
#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: BETA10 0x101bd268
// SIZE 0x144
@ -68,6 +42,32 @@ class JetskiRace : public LegoRace {
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: BETA10 0x100a9b70
// JetskiRace::`scalar deleting destructor'

View File

@ -24,6 +24,9 @@ class JukeBoxState : public LegoState {
JukeBoxState() : m_music(e_pasquell), m_active(FALSE) {}
// FUNCTION: LEGO1 0x1000f300
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000f310
// FUNCTION: BETA10 0x100389c0
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);
}
// FUNCTION: LEGO1 0x1000f300
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// SYNTHETIC: LEGO1 0x1000f3d0
// JukeBoxState::`scalar deleting destructor'

View File

@ -22,6 +22,9 @@ class LegoAct2State : public LegoState {
}
~LegoAct2State() override {}
// FUNCTION: LEGO1 0x1000df70
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// FUNCTION: LEGO1 0x1000df80
// FUNCTION: BETA10 0x1003c7e0
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);
}
// FUNCTION: LEGO1 0x1000df70
MxBool IsSerializable() override { return FALSE; } // vtable+0x14
// SYNTHETIC: LEGO1 0x1000e040
// LegoAct2State::`scalar deleting destructor'

View File

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

View File

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

View File

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

View File

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

View File

@ -67,7 +67,7 @@ class LegoCharacterManager {
void ReleaseActor(const char* p_name);
void ReleaseActor(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);
LegoActorInfo* GetActorInfo(const char* p_name);
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 GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; }
MxU8 GetFlags() { return m_flags; }
// FUNCTION: BETA10 0x10049db0
MxFloat GetWorldSpeed() { return m_worldSpeed; }
// FUNCTION: BETA10 0x1000f2f0

View File

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

View File

@ -18,6 +18,9 @@ class LegoModelPresenter : public MxVideoPresenter {
// FUNCTION: LEGO1 0x10067a10
~LegoModelPresenter() override { Destroy(TRUE); }
// FUNCTION: LEGO1 0x1000cca0
void Destroy() override { Destroy(FALSE); } // vtable+0x38
static void configureLegoModelPresenter(MxS32 p_modelPresenterConfig);
// FUNCTION: BETA10 0x100a7180
@ -42,7 +45,6 @@ class LegoModelPresenter : public MxVideoPresenter {
void ReadyTickle() override; // vtable+0x18
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);

View File

@ -12,7 +12,18 @@ class LegoNamedPart {
m_name = p_name;
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; }
LegoLODList* GetList() { return m_list; }

View File

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

View File

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

View File

@ -34,6 +34,8 @@ class RaceState : public LegoState {
}
MxS16 GetUnknown0x02() { return m_unk0x02; }
// FUNCTION: BETA10 0x10088970
MxS16 GetHighScore() { return m_score; }
// FUNCTION: BETA10 0x100c96f0
@ -110,6 +112,19 @@ class LegoRace : public LegoWorld {
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: BETA10 0x100a8940
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);
}
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
virtual MxLong HandleType0Notification(MxNotificationParam&) { return 0; } // vtable+0x78
@ -145,6 +149,11 @@ class LegoRace : public LegoWorld {
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
// 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
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
// FUNCTION: LEGO1 0x10014aa0
// FUNCTION: BETA10 0x100ca038
virtual MxResult FUN_10014aa0() { return SUCCESS; }
virtual MxResult FUN_10014aa0();
// SYNTHETIC: LEGO1 0x10012c10
// LegoRaceActor::`vbase destructor'

View File

@ -25,81 +25,6 @@ struct SkeletonKickPhase {
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 0x100d5a28 LegoRaceActor
// VTABLE: LEGO1 0x100d5a30 LegoAnimActor
@ -134,19 +59,25 @@ class LegoJetski : public LegoJetskiRaceActor, public LegoRaceMap {
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
// FUNCTION: LEGO1 0x10014150
MxU32 VTable0x6c(LegoPathBoundary* p_boundary, Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3)
override
{
return LegoJetskiRaceActor::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
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
override; // vtable+0x98
MxResult VTable0x9c() override; // vtable+0x9c
// FUNCTION: LEGO1 0x100141d0
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);
@ -154,6 +85,88 @@ class LegoJetski : public LegoJetskiRaceActor, public LegoRaceMap {
// 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
// LegoRaceCar::`vbtable'{for `LegoCarRaceActor'}

View File

@ -84,22 +84,6 @@ class LegoState : public MxCore {
// FUNCTION: LEGO1 0x10005f40
~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
virtual MxBool IsSerializable() { return TRUE; } // vtable+0x14
@ -116,6 +100,22 @@ class LegoState : public MxCore {
return SUCCESS;
} // 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
// LegoState::`scalar deleting destructor'
};

View File

@ -19,7 +19,7 @@ class LegoTextureInfo {
static BOOL SetGroupTexture(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:
char* m_name; // 0x00

View File

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

View File

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

View File

@ -15,6 +15,16 @@ class ScoreState : public LegoState {
public:
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: BETA10 0x100a7a70
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);
}
// 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; }
void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; }
@ -59,6 +59,9 @@ class Score : public LegoWorld {
~Score() override;
MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x100010b0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x100010c0
// FUNCTION: BETA10 0x100f4f20
const char* ClassName() const override // vtable+0x0c
@ -78,14 +81,13 @@ class Score : public LegoWorld {
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50
MxBool VTable0x5c() override; // vtable+0x5c
MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68
void Paint();
MxLong FUN_10001510(MxEndActionNotificationParam& 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:
void DeleteScript();

View File

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

View File

@ -311,7 +311,7 @@ void Act2Actor::Animate(float p_time)
local30 -= local60;
local30.Unitize();
MxFloat dotproduct = local18.Dot(&local30, &local18);
MxFloat dotproduct = local18.Dot(local30, local18);
if (dotproduct >= 0.0) {
const MxFloat* pepperWorldPosition = roiPepper->GetWorldPosition();
@ -444,6 +444,8 @@ MxS32 Act2Actor::VTable0xa0()
{
undefined4 newLocation;
assert(!m_grec);
CurrentWorld();
MxU16 randomVal = rand() / (RAND_MAX / 2) + 1;
@ -613,9 +615,9 @@ MxU32 Act2Actor::FUN_10019700(MxFloat p_param)
col2 = col3;
col2 -= m_unk0x4c->GetROI()->GetWorldPosition();
col2.Unitize();
col0.EqualsCross(&col1, &col2);
col0.EqualsCross(col1, col2);
col0.Unitize();
col1.EqualsCross(&col2, &col0);
col1.EqualsCross(col2, col0);
assert(!m_cameraFlag);
@ -867,13 +869,3 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
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++) {
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);
break;
}
@ -246,8 +246,8 @@ void Act3Cop::ParseAction(char* p_extra)
Mx4DPointFloat* boundary0x14 = boundary->GetUnknown0x14();
if (point.Dot(&point, boundary0x14) + boundary0x14->index_operator(3) <= 0.001 &&
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) {
continue;
}
@ -496,9 +496,9 @@ MxResult Act3Cop::FUN_10040360()
v3 = v4;
v3 -= vecUnk;
v3.Unitize();
v1.EqualsCross(&v2, &v3);
v1.EqualsCross(v2, v3);
v1.Unitize();
v2.EqualsCross(&v3, &v1);
v2.EqualsCross(v3, v1);
VTable0x9c();
}
@ -628,9 +628,9 @@ void Act3Brickster::Animate(float p_time)
localc = local20;
localc -= m_pInfo->m_position;
localc.Unitize();
local14.EqualsCross(&local28, &localc);
local14.EqualsCross(local28, localc);
local14.Unitize();
local28.EqualsCross(&localc, &local14);
local28.EqualsCross(localc, local14);
assert(!m_cameraFlag);
@ -675,9 +675,9 @@ void Act3Brickster::Animate(float p_time)
local80 -= m_unk0x3c;
local80.Unitize();
local88.EqualsCross(&local9c, &local80);
local88.EqualsCross(local9c, local80);
local88.Unitize();
local9c.EqualsCross(&local80, &local88);
local9c.EqualsCross(local80, local88);
assert(!m_cameraFlag);
@ -991,9 +991,9 @@ MxResult Act3Brickster::FUN_100417c0()
v3 = v4;
v3 -= vecUnk;
v3.Unitize();
v1.EqualsCross(&v2, &v3);
v1.EqualsCross(v2, v3);
v1.Unitize();
v2.EqualsCross(&v3, &v1);
v2.EqualsCross(v3, v1);
VTable0x9c();
@ -1087,7 +1087,7 @@ MxS32 Act3Brickster::FUN_10042300()
local18 = local64[local1c];
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;
m_boundary = boundaries[i];
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[0] = 1.0f;
local3c.EqualsCross(&localc, &local14);
local3c.EqualsCross(localc, local14);
if (local3c.Unitize() != 0) {
local14[0] = local14[1] = 0.0f;
local14[2] = 1.0f;
local3c.EqualsCross(&localc, &local14);
local3c.EqualsCross(localc, local14);
if (local3c.Unitize() != 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;
}
@ -340,17 +340,17 @@ void Act3Ammo::Animate(float p_time)
local184 = *m_boundary->GetUnknown0x14();
local17c[0] = 1.0f;
local17c[1] = local17c[2] = 0.0f;
local174.EqualsCross(&local17c, &local184);
local174.EqualsCross(local17c, local184);
local174.Unitize();
local17c.EqualsCross(&local184, &local174);
local17c.EqualsCross(local184, local174);
}
else {
local17c = *m_boundary->GetUnknown0x14();
local184[0] = 1.0f;
local184[1] = local184[2] = 0.0f;
local174.EqualsCross(&local17c, &local184);
local174.EqualsCross(local17c, local184);
local174.Unitize();
local184.EqualsCross(&local174, &local17c);
local184.EqualsCross(local174, local17c);
}
}

View File

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

View File

@ -133,7 +133,7 @@ void IslePathActor::Exit()
for (j = 0; j < m_boundary->GetNumEdges(); 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;
}
}
@ -645,7 +645,7 @@ void IslePathActor::FUN_1001b660()
Vector3 up(transform[2]);
up *= -1.0f;
position.EqualsCross(&direction, &up);
position.EqualsCross(direction, up);
m_roi->FUN_100a58f0(transform);
m_roi->VTable0x14();
}

View File

@ -624,6 +624,7 @@ MxResult PizzaMissionState::Serialize(LegoFile* p_file)
}
// FUNCTION: LEGO1 0x10039510
// FUNCTION: BETA10 0x100eed45
PizzaMissionState::Mission* PizzaMissionState::GetMission(MxU8 p_actorId)
{
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_unk0x25c.BETA_1004a9b0(m_unk0x178, m_unk0x208);
m_unk0x25c.SetStartEnd(m_unk0x178, m_unk0x208);
}
// 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;
m_unk0x25c.BETA_1004aaa0(local78, local1c);
m_unk0x25c.InterpolateToMatrix(local78, local1c);
local78[3][0] = m_unk0x178[3][0] + local18[0];
local78[3][1] = m_unk0x178[3][1] + local18[1];
@ -1203,7 +1203,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
assert(destWorld);
m_buildState->m_animationState = LegoVehicleBuildState::e_exiting;
if (m_unk0x258->AllPartsPlaced()) {
if (!m_unk0x258->AllPartsPlaced()) {
FUN_100243a0();
}
else {
@ -1211,8 +1211,7 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
}
}
else {
MxNotificationParam param;
NotificationManager()->Send(this, param);
NotificationManager()->Send(this, MxNotificationParam());
}
break;
case 2:
@ -1239,9 +1238,8 @@ undefined4 LegoCarBuild::FUN_10024c20(LegoEventNotificationParam* p_param)
FUN_10024ef0();
}
else {
MxNotificationParam p;
// In BETA10, NotificationManager->Send() also takes __FILE__ and __LINE__ arguments
NotificationManager()->Send(this, p);
NotificationManager()->Send(this, MxNotificationParam());
}
break;
}

View File

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

View File

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

View File

@ -1596,7 +1596,7 @@ MxU16 LegoAnimationManager::FUN_10062110(
if (GetViewManager()->IsBoundingBoxInFrustum(p_roi->GetWorldBoundingBox())) {
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());
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* vehicleWC;
LegoLocomotionAnimPresenter* presenter;
if (g_characters[p_characterId].m_vehicleId >= 0 && g_vehicles[g_characters[p_characterId].m_vehicleId].m_unk0x04 &&
(vehicleWC = cycles[10]) != NULL) {
LegoLocomotionAnimPresenter* presenter =
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) {
presenter->FUN_1006d680(p_actor, 1.7f);
@ -2359,8 +2359,7 @@ MxBool LegoAnimationManager::FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_
else {
vehicleWC = cycles[p_mood];
if (vehicleWC != NULL) {
LegoLocomotionAnimPresenter* presenter =
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) {
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];
if (vehicleWC != NULL) {
LegoLocomotionAnimPresenter* presenter =
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) {
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];
if (vehicleWC != NULL) {
LegoLocomotionAnimPresenter* presenter =
(LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
presenter = (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC);
if (presenter != NULL) {
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* v2 = p_edge->CCWVertex(*p_boundary);
assert(v1 && v2);
p1 = *v2;
p1 -= *v1;
p1 *= p_destScale;
@ -2493,7 +2492,12 @@ MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoUnkn
boundingBox.Min() -= vec;
boundingBox.Max() = p1;
boundingBox.Max() += vec;
return GetViewManager()->IsBoundingBoxInFrustum(boundingBox) == FALSE;
if (GetViewManager()->IsBoundingBoxInFrustum(boundingBox) == FALSE) {
return TRUE;
}
return FALSE;
}
// FUNCTION: LEGO1 0x10064120
@ -2525,7 +2529,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
for (i = 0; i < numEdges; i++) {
e = (LegoUnknown100db7f4*) boundary->GetEdges()[i];
e->FUN_1002ddc0(*boundary, vec);
float dot = vec.Dot(&direction, &vec);
float dot = vec.Dot(direction, vec);
if (dot > local4c) {
local50 = e;
@ -2793,8 +2797,8 @@ void LegoAnimationManager::FUN_100648f0(LegoTranInfo* p_tranInfo, MxLong p_unk0x
LegoLocation* location = NavController()->GetLocation(p_tranInfo->m_location);
if (location != NULL) {
CalcLocalTransform(location->m_position, location->m_direction, location->m_up, m_unk0x484);
m_unk0x4cc.BETA_1004a9b0(m_unk0x43c, m_unk0x484);
m_unk0x4cc.FUN_10004520();
m_unk0x4cc.SetStartEnd(m_unk0x43c, m_unk0x484);
m_unk0x4cc.NormalizeDirection();
}
else {
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[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);
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()) {
// TODO: Computed constants based on what?
p_r *= 4.3478260869565215;
p_g *= 1.5873015873015872;
p_b *= 1.1764705882352942;
p_r *= 1. / 0.23;
p_g *= 1. / 0.63;
p_b *= 1. / 0.85;
if (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++) {
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(
"Building %d shot location (%g, %g, %g) is not in boundary %s.\n",
i,
@ -826,8 +826,8 @@ MxResult LegoBuildingManager::FUN_10030630()
if (g_buildingInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_buildingInfo[i].m_boundary->GetUnknown0x14();
if (position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) > 0.001 ||
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) {
g_buildingInfo[i].m_y =
-((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) +

View File

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

View File

@ -1,5 +1,36 @@
#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 "act2brick.h"
#include "act2genactor.h"

View File

@ -145,7 +145,7 @@ MxResult LegoPlantManager::FUN_10026410()
for (MxS32 j = 0; j < boundary->GetNumEdges(); 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(
"Plant %d shot location (%g, %g, %g) is not in boundary %s.\n",
i,
@ -162,8 +162,8 @@ MxResult LegoPlantManager::FUN_10026410()
if (g_plantInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_plantInfo[i].m_boundary->GetUnknown0x14();
if (position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) > 0.001 ||
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) {
g_plantInfo[i].m_y =
-((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;
MxS32 i;
LegoU8* bits;
const LegoU8* bits;
MxU8* surface;
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
LegoResult LegoTextureInfo::FUN_10066010(LegoU8* p_bits)
LegoResult LegoTextureInfo::FUN_10066010(const LegoU8* p_bits)
{
if (m_surface != NULL && m_texture != NULL) {
DDSURFACEDESC desc;
@ -195,7 +195,7 @@ LegoResult LegoTextureInfo::FUN_10066010(LegoU8* p_bits)
if (m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) {
MxU8* surface = (MxU8*) desc.lpSurface;
LegoU8* bits = p_bits;
const LegoU8* bits = p_bits;
if (desc.dwWidth == desc.lPitch) {
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
void SetCameraControllerFromIsle()
{
InputManager()->SetCamera(FindWorld(*g_isleScript, IsleScript::c__Isle)->GetCamera());
InputManager()->SetCamera(FindWorld(*g_isleScript, IsleScript::c__Isle)->GetCameraController());
}
// FUNCTION: LEGO1 0x1003eae0
@ -709,7 +709,7 @@ void WriteDefaultTexture(LegoFile* p_file, const char* p_name)
}
else {
MxU8* surface = (MxU8*) desc.lpSurface;
LegoU8* bits = image->GetBits();
const LegoU8* bits = image->GetBits();
for (MxS32 i = 0; i < desc.dwHeight; i++) {
memcpy(surface, bits, desc.dwWidth);

View File

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

View File

@ -127,7 +127,7 @@ void LegoActor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2)
if (p_roi) {
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])) {
m_type = e_actor;
m_actorId = i;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -16,6 +16,7 @@
#include "mxutilities.h"
#include "mxvariabletable.h"
#include <mxdebug.h>
#include <vec.h>
DECOMP_SIZE_ASSERT(LegoPathActor, 0x154)
@ -142,11 +143,11 @@ MxResult LegoPathActor::VTable0x88(
dir *= -1.0f;
}
right.EqualsCross(&up, &dir);
right.EqualsCross(up, dir);
m_roi->UpdateTransformationRelativeToParent(matrix);
if (!m_cameraFlag || !m_userNavFlag) {
p5.EqualsCross(p_boundary->GetUnknown0x14(), &p3);
p5.EqualsCross(*p_boundary->GetUnknown0x14(), p3);
p5.Unitize();
if (VTable0x80(p1, p4, p2, p5) == SUCCESS) {
@ -208,11 +209,11 @@ MxResult LegoPathActor::VTable0x84(
dir *= -1.0f;
}
right.EqualsCross(&up, &dir);
right.EqualsCross(up, dir);
m_roi->UpdateTransformationRelativeToParent(matrix);
if (!m_cameraFlag || !m_userNavFlag) {
p5.EqualsCross(p_boundary->GetUnknown0x14(), &p3);
p5.EqualsCross(*p_boundary->GetUnknown0x14(), p3);
p5.Unitize();
if (VTable0x80(p_p1, p_p4, p2, p5) == SUCCESS) {
@ -233,7 +234,7 @@ MxResult LegoPathActor::VTable0x84(
// FUNCTION: LEGO1 0x1002e100
// 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) {
m_lastTime = p_time;
@ -243,22 +244,27 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
p4 = Vector3(m_roi->GetWorldPosition());
LegoNavController* nav = NavController();
assert(nav);
m_worldSpeed = nav->GetLinearVel();
if (nav->CalculateNewPosDir(p4, p5, p2, p1, m_boundary->GetUnknown0x14())) {
Mx3DPointFloat p6;
p6 = p2;
MxS32 result = 0;
m_unk0xe9 = m_boundary->Intersect(m_roi->GetWorldBoundingSphere().Radius(), p4, p2, p3, m_destEdge);
if (m_unk0xe9 == -1) {
MxTrace("Intersect returned -1\n");
return -1;
}
if (m_unk0xe9 != 0) {
p2 = p3;
else {
if (m_unk0xe9 != 0) {
p2 = p3;
}
}
MxS32 result = VTable0x68(p4, p2, p3);
result = VTable0x68(p4, p2, p3);
if (result > 0) {
p2 = p4;
@ -308,12 +314,18 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
dir = p1;
up = *m_boundary->GetUnknown0x14();
right.EqualsCross(&up, &dir);
right.Unitize();
dir.EqualsCross(&right, &up);
right.EqualsCross(up, dir);
MxS32 res = right.Unitize();
assert(res == 0);
dir.EqualsCross(right, up);
pos = p2;
return result;
}
else {
return -1;
}
}
else if (p_time >= 0 && m_worldSpeed > 0) {
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;
p_transform.SetIdentity();
LegoResult r;
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 {
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 pos2(m_unk0xec[3]);
Mx3DPointFloat p1;
@ -350,16 +365,17 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
else {
m_boundary->FUN_100575b0(pos2, pos1, this);
pos2 = pos1;
}
if (m_unk0xe9 != 0) {
VTable0x9c();
}
return 0;
if (m_unk0xe9 != 0) {
VTable0x9c();
}
}
else {
return -1;
}
return -1;
return 0;
}
// FUNCTION: LEGO1 0x1002e740
@ -414,7 +430,7 @@ void LegoPathActor::Animate(float p_time)
LegoWorld* world = CurrentWorld();
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);
m_destEdge->FUN_1002ddc0(*m_boundary, local78);
local48.EqualsCross(m_boundary->GetUnknown0x14(), &local78);
local48.EqualsCross(*m_boundary->GetUnknown0x14(), local78);
local48.Unitize();
}
@ -646,10 +662,10 @@ MxResult LegoPathActor::VTable0x9c()
upRef = *m_boundary->GetUnknown0x14();
rightRef.EqualsCross(&upRef, &dirRef);
rightRef.EqualsCross(upRef, dirRef);
rightRef.Unitize();
dirRef.EqualsCross(&rightRef, &upRef);
dirRef.EqualsCross(rightRef, upRef);
dirRef.Unitize();
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 -= *ccwV;
float dot1 = v.Dot(&v, m_unk0x50);
float dot1 = v.Dot(v, *m_unk0x50);
v = p_point2;
v -= *ccwV;
float dot2 = v.Dot(&v, m_unk0x50);
float dot2 = v.Dot(v, *m_unk0x50);
if (dot2 > dot1) {
for (MxS32 i = 0; i < m_numTriggers; i++) {
@ -197,7 +197,7 @@ MxU32 LegoPathBoundary::Intersect(
for (MxS32 i = 0; i < m_numEdges; 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) {
local10 = 1;
vec = p_point2;
@ -212,9 +212,9 @@ MxU32 LegoPathBoundary::Intersect(
vec /= len;
}
float dot = vec.Dot(&vec, &m_edgeNormals[i]);
float dot = vec.Dot(vec, m_edgeNormals[i]);
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)) {
e = edge;
@ -242,7 +242,7 @@ MxU32 LegoPathBoundary::Intersect(
e->FUN_1002ddc0(*this, local70);
float local58 = local50.Dot(&local50, &local70);
float local58 = local50.Dot(local50, local70);
LegoUnknown100db7f4* local54 = NULL;
if (local58 < 0.0f) {
@ -252,7 +252,7 @@ MxU32 LegoPathBoundary::Intersect(
local88 = (LegoUnknown100db7f4*) local88->GetClockwiseEdge(*this)) {
local88->FUN_1002ddc0(*this, local84);
if (local84.Dot(&local84, &local70) <= 0.9) {
if (local84.Dot(local84, local70) <= 0.9) {
break;
}
@ -260,7 +260,7 @@ MxU32 LegoPathBoundary::Intersect(
Mx3DPointFloat locala4(p_point3);
locala4 -= *local90;
float local8c = locala4.Dot(&locala4, &local84);
float local8c = locala4.Dot(locala4, local84);
if (local8c > local58 && local8c < local88->m_unk0x3c) {
local54 = local88;
@ -279,7 +279,7 @@ MxU32 LegoPathBoundary::Intersect(
locala8 = (LegoUnknown100db7f4*) locala8->GetCounterclockwiseEdge(*this)) {
locala8->FUN_1002ddc0(*this, localbc);
if (localbc.Dot(&localbc, &local70) <= 0.9) {
if (localbc.Dot(localbc, local70) <= 0.9) {
break;
}
@ -287,7 +287,7 @@ MxU32 LegoPathBoundary::Intersect(
Mx3DPointFloat locald8(p_point3);
locald8 -= *localc4;
float localc0 = locald8.Dot(&locald8, &localbc);
float localc0 = locald8.Dot(locald8, localbc);
if (localc0 < local58 && localc0 >= 0.0f) {
local54 = locala8;

View File

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

View File

@ -35,24 +35,6 @@ LegoRace::LegoRace()
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: BETA10 0x100c7a71
MxResult LegoRace::Create(MxDSAction& p_dsAction)
@ -165,6 +147,7 @@ MxResult RaceState::Serialize(LegoFile* p_file)
}
// FUNCTION: LEGO1 0x10016280
// FUNCTION: BETA10 0x100c7dfd
RaceState::Entry* RaceState::GetState(MxU8 p_id)
{
for (MxS16 i = 0;; i++) {

View File

@ -116,3 +116,10 @@ MxResult LegoRaceActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
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
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
LegoRaceCar::LegoRaceCar()
{
@ -197,6 +192,11 @@ MxLong LegoRaceCar::Notify(MxParam& 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
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
a->GetAnimTreePtr()->GetCamAnim()->FUN_1009f490(deltaTime, transformationMatrix);
if (r->GetCamera()) {
r->GetCamera()->FUN_100123e0(transformationMatrix, 0);
if (r->GetCameraController()) {
r->GetCameraController()->FUN_100123e0(transformationMatrix, 0);
}
m_roi->FUN_100a58f0(transformationMatrix);
@ -727,49 +727,3 @@ MxResult LegoJetski::HitActor(LegoPathActor* p_actor, MxBool p_bool)
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);
crossProduct.EqualsCross(m_boundary->GetUnknown0x14(), &destEdgeUnknownVector);
crossProduct.EqualsCross(*m_boundary->GetUnknown0x14(), destEdgeUnknownVector);
crossProduct.Unitize();
Mx3DPointFloat worldDirection(Vector3(m_roi->GetWorldDirection()));
@ -260,8 +260,8 @@ MxResult LegoCarRaceActor::VTable0x9c()
d->FUN_1002ddc0(*b, point2);
m_destEdge->FUN_1002ddc0(*m_boundary, point3);
point4.EqualsCross(&point2, m_boundary->GetUnknown0x14());
point5.EqualsCross(m_boundary->GetUnknown0x14(), &point3);
point4.EqualsCross(point2, *m_boundary->GetUnknown0x14());
point5.EqualsCross(*m_boundary->GetUnknown0x14(), point3);
point4.Unitize();
point5.Unitize();

View File

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

View File

@ -50,7 +50,7 @@ void LegoLoopingAnimPresenter::PutFrame()
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++) {
if (m_unk0x8c[i] != NULL) {
MxMatrix mat(m_unk0x8c[i]->GetLocal2World());
@ -66,11 +66,11 @@ void LegoLoopingAnimPresenter::PutFrame()
up = und;
up -= m_currentWorld->GetCamera()->GetWorldLocation();
up -= m_currentWorld->GetCameraController()->GetWorldLocation();
dir /= dirsqr;
pos.EqualsCross(&dir, &up);
pos.EqualsCross(dir, up);
pos.Unitize();
up.EqualsCross(&pos, &dir);
up.EqualsCross(pos, dir);
pos *= possqr;
dir *= dirsqr;
up *= upsqr;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -32,12 +32,6 @@ Score::Score()
NotificationManager()->Register(this);
}
// FUNCTION: LEGO1 0x100010b0
MxBool Score::VTable0x5c()
{
return TRUE;
}
// FUNCTION: LEGO1 0x10001200
Score::~Score()
{
@ -260,7 +254,8 @@ void Score::Paint()
memset(&desc, 0, 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) {
cube->m_surface->Unlock(desc.lpSurface);
return;
@ -296,7 +291,7 @@ void Score::Paint()
// FUNCTION: LEGO1 0x10001d20
// 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 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 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];
MxS32 color = colors[score];
MxS32 size = local28[i_activity];

View File

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

View File

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

View File

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

View File

@ -57,7 +57,6 @@ class LegoContainer {
}
}
// FUNCTION: BETA10 0x1007bc00
T* Get(const char* p_name)
{
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
// clang-format on
// TEMPLATE: BETA10 0x1007bc00
// LegoContainer<LegoTextureInfo>::Get
#endif // LEGOCONTAINER_H

View File

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

View File

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

View File

@ -4,7 +4,7 @@
#include "legotypes.h"
#include "mxgeometry/mxgeometry3d.h"
class Matrix4;
class MxMatrix;
// SIZE 0x50
class LegoUnknown {
@ -13,7 +13,7 @@ class LegoUnknown {
~LegoUnknown();
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:
Mx3DPointFloat m_unk0x00[4]; // 0x00

View File

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

View File

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

View File

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

View File

@ -2,8 +2,7 @@
#define MXGEOMETRY3D_H
#include "decomp.h"
#include "realtime/matrix.h"
#include "realtime/vector.h"
#include "realtime/vector3d.inl.h"
// VTABLE: LEGO1 0x100d4488
// VTABLE: BETA10 0x101b84d0
@ -53,199 +52,4 @@ class Mx3DPointFloat : public Vector3 {
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

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
#define MXMATRIX_H
#include "realtime/matrix.h"
#include "realtime/matrix4d.inl.h"
// VTABLE: LEGO1 0x100d4300
// VTABLE: BETA10 0x101b82e0
@ -35,4 +35,9 @@ class MxMatrix : public Matrix4 {
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

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:
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
static const char* HandlerClassName()
{
@ -30,12 +36,6 @@ class MxAudioPresenter : public MxMediaPresenter {
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:
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
// reference to "this". In the beta it is called in two places:
// 1. GetBmiHeightAbs
// 2. MxSmack::LoadFrame
// 2. MxSmk::LoadFrame
// FUNCTION: BETA10 0x1002c690
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
// MxUtilityList<MxNextActionDataStart *>::PushBack
// TEMPLATE: BETA10 0x10150ff0
// MxUtilityList<MxDSObject *>::PushBack
#endif // MXDISKSTREAMCONTROLLER_H

View File

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

View File

@ -35,10 +35,12 @@ class MxDSChunk : public MxCore {
}
static MxU32 GetHeaderSize();
static MxU32* IntoType(MxU8* p_buffer) { return (MxU32*) p_buffer; }
static MxU32* IntoLength(MxU8* p_buffer) { return (MxU32*) (p_buffer + 4); }
static MxU32 Size(MxU32 p_dataSize) { return (p_dataSize & 1) + p_dataSize + 8; }
static MxU8* End(MxU8* p_buffer) { return p_buffer + Size(*IntoLength(p_buffer)); }
// FUNCTION: BETA10 0x101641f0
static MxU32 Size(MxU8* p_buffer) { return (*(MxU32*) (p_buffer + 4) & 1) + *(MxU32*) (p_buffer + 4) + 8; }
// 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 SetObjectId(undefined4 p_objectid) { m_objectId = p_objectid; }

View File

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

View File

@ -29,6 +29,7 @@ class MXIOINFO {
MxU16 Advance(MxU16);
MxU16 Descend(MMCKINFO*, const 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
// an HFILE (int) instead of an HMMIO (WORD).

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