Commit Graph

42 Commits

Author SHA1 Message Date
foxtacles
7b114bbe59
Add multiplayer extension (#789)
* Add multiplayer extension

* Fix animation system to work when host is outside ISLE world

- Move TickHostSessions outside m_inIsleWorld gate so the host can
  coordinate animations from any world
- Load animation catalog early in HandleCreate so the host can
  coordinate before entering the ISLE world
- Use network-reported positions for remote player location detection
  instead of requiring spawned ROIs
- Always erase sessions at launch — the host's job ends when the
  animation starts; clients play and complete independently
- Replace BroadcastAnimComplete with locally-driven completion
  callbacks: host generates eventId at launch, clients cache
  completion JSON at start time, fire it when ScenePlayer finishes
- Make StopAnimation only do local cleanup (stop playback, cancel
  own interest, reset coordinator) without destroying the session
  host, so other players' sessions survive world transitions
- Broadcast state=0 in ResetAnimationState for full teardown paths
  (shutdown, reconnect, host migration) so clients aren't left with
  stale session state

* Fix use-after-free crash in ScenePlayer when remote player disconnects mid-animation

When a remote player's ROI is destroyed (disconnect, timeout, or respawn),
notify all active ScenePlayer instances to null out dangling references
before the ROI is freed. The animation engine already handles null ROI map
entries gracefully, so playback continues for remaining participants.

* Fix crash when performer's child ROIs are left dangling in ScenePlayer

NotifyROIDestroyed now walks the parent chain to also invalidate child
ROIs of the destroyed performer (head, limbs, etc.) that were placed
into the roiMap by BuildROIMap. The ancestor walk happens once; all
other fields are cleaned with simple pointer equality.

* Allow spectator to play click animation during scene playback

* Make PTATCAM track spectator ROI instead of camera in ScenePlayer

* Only regenerate emscripten version files when git state changes

Replace add_custom_target(ALL) with add_custom_command(OUTPUT) so the
version script only runs when .git/HEAD or the current branch ref file
changes, instead of on every build.

* Fix ROI name collision causing dangling pointers in NPC locomotion roiMaps

When ScenePlayer created cloned NPC ROIs for cooperative animations, it
renamed them to match the original character name and added them to the
ViewManager. This created a name collision: two ROIs with the same name.
The original game's AppendROIToScene searches by name and stops at the
first match, so if a locomotion BuildROIMap ran while the clone existed,
it could capture pointers to the clone's child ROIs. When the clone was
later destroyed (CleanupProps), those roiMap entries became dangling
pointers, crashing in AnimateWithTransform at roi.h:151 (SetVisibility).

Fix: use the alias mechanism (already supported by AnimUtils::BuildROIMap)
instead of renaming clones. Also unify all ROI name generation behind a
shared counter to prevent character manager key collisions.
2026-04-05 17:13:15 +02:00
Anonymous Maarten
85ff14e997
Remove debug window (#736)
* Remove debug window

* LEGO1: remove a few exports

* LEGO1: Remove a few `friend class DebugViewer` declarations
2025-11-21 14:20:37 +00:00
Christian Semmler
72dae4dd52
Merge remote-tracking branch 'isle/master' 2025-07-29 16:47:18 -07:00
jonschz
03adac0c58
Match LegoOmni::Create(), other BETA10 matches (#1651)
* Match `LegoOmni::Create()`, other BETA10 matches

---------

Co-authored-by: jonschz <jonschz@users.noreply.github.com>
2025-07-25 17:13:34 +02:00
Christian Semmler
99be9c8767
Merge remote-tracking branch 'isle/master' 2025-06-29 08:56:06 -07:00
Fabian Neundorf
9dcc701fcb
Clear unknowns in GetSoundId (#1594) 2025-06-28 20:32:09 +02:00
Christian Semmler
a939a6fec3
Merge remote-tracking branch 'isle/master' 2025-06-17 10:34:32 -07:00
Fabian Neundorf
fd3f08f4c4
Clear unknowns in LegoBuildingInfo and LegoBuildingManager (#1566)
* Clear unknowns in `LegoBuildingInfo` and `LegoBuildingManager`

* Name remaining unknown in `LegoBuildingManager`
2025-06-16 23:08:17 +02:00
Anonymous Maarten
183efa3d8f
More debug features: pause/step/resume (#140)
* More debug features: pause/step/resume

* Fix palette order (I think)

* Revert "Fix palette order (I think)"

This reverts commit a81de08f78.
2025-05-21 19:54:22 +02:00
Anonymous Maarten
bb4db6caac
Use SDL3 functions in more locations (#44)
* Use strcasecmp, strncasecmp, strlwr, strupr and itoa from SDL

* Use SDL_GetTicks instead of timeGetTime

* Use MxDSFile::OPEN_READ instead of OF_READ

* Use SDL_IOStream to read bitmaps

* Use SDL_LogXXX instead of OutputDebugString

* Undo mxvideoparam.h change

* Revert "Undo mxvideoparam.h change"

This reverts commit 4a20cf6c46.

* Fix _MxTrace

* Reapply "Undo mxvideoparam.h change"

This reverts commit b3a09dc520.

* fix _MxTrace

* Use __declspec(dllexport) for exporting symbols from dll

Refactored CMake script such that all objects are passed to the lego1 library.

* clang-format

* fix msvc build

* MSVC fixed for real now?

* Forgot about d3drm_guid

* Fix naming issue

* Use Uint64 in LegoCarBuild::Tickle for dTime
2024-12-24 18:04:46 -07:00
jonschz
3e6d789324
Add all BETA10 ClassName() functions and vtables (#1258)
* Add all BETA10 `ClassName()` functions and vtables

* Run formatter, fix copy error

* Fix copy error

* Add BETA10 library functions

---------

Co-authored-by: jonschz <jonschz@users.noreply.github.com>
2024-12-22 08:13:34 -07:00
Christian Semmler
1aff40dd94
Implement/match several functions in Act3, refactor (#1197)
* Implement/match several functions in Act3, refactor

* Fix naming

* Rename

* Add comment

* Add annotation

* Add BETA assert
2024-12-08 18:00:57 +01:00
Christian Semmler
e56ac9ab55
Implement/match LegoBuildingManager::FUN_10030630 (#1164) 2024-11-22 23:08:23 +01:00
Christian Semmler
bee101b1f4
Add clang-tidy readability-redundant-inline-specifier (#1060)
* Add clang-tidy readability-redundant-inline-specifier

* fix

* Update CONTRIBUTING.md

* format

* fix
2024-07-05 01:06:32 +02:00
Christian Semmler
9ba05d021d
Implement/match LegoPlantManager::ScheduleAnimation (#1051)
* Implement/match LegoPlantManager::ScheduleAnimation

* Add assert
2024-07-02 01:14:04 +02:00
Christian Semmler
62307e1819
Implement/match LegoPlantManager::FUN_10026c50 (#1043)
* Minor fixes

* Implement/match LegoPlantManager::FUN_10026c50
2024-06-25 17:28:10 +02:00
Christian Semmler
1d666f62e5
Implement/match LegoPlantManager interaction functions (#1041) 2024-06-19 18:57:05 +02:00
Christian Semmler
656e7fc674
Implement/match more LegoPlantManager functions (#1040) 2024-06-19 18:02:54 +02:00
Christian Semmler
e507f42717
Implement/match LegoPlantManager::CreatePlant (#1039)
* Implement/match LegoPlantManager::CreatePlant

* Update names

* Fix name

* Fix

* Fix
2024-06-18 19:35:03 +02:00
Christian Semmler
1a46d370ec
Bootstrap LegoPlantManager, add plants data (#1038)
* Bootstrap LegoPlantManager, add plants data

* Naming

* Move

* Fix
2024-06-17 20:11:27 +02:00
Christian Semmler
49c17c9c6a
Implement/match LegoEntity::SwitchSound / SwitchMove / SwitchColor / SwitchMood (#995)
* Implement/match LegoEntity::SwitchSound

* Name

* Name

* Implement/match LegoEntity::SwitchMove

* Mood
2024-06-05 19:40:44 +02:00
Christian Semmler
f6c923a84e
Implement/match LegoEntity::ClickAnimation (#994)
* Implement/match LegoEntity::VTable0x38

* Update names
2024-06-05 19:00:46 +02:00
Mark Langen
55299229c2
LegoBuildingManager Round 2 (#890)
* LegoBuildingManager Round 2

* 100% match most of the remaining methods, only
  Tickle and FUN_10030630 remain.

* The interesting finding is that the curious
  members of the LegoBuildingManager form a short
  embedded fixed-length array used to store info
  about current animation of buildings.

* I saw that you removed the SetY which I had
  added to MxMatrix. Agree that this method
  doesn't make sense on MxMatrix, however I've
  added it back to Matrix4. I see the pattern of
  setting / getting the Y component used in enough
  places that I doubt they were just hoping they
  remembered the subscript correctly every time.
  Let me know if you agree or still don't think it
  makes sense to include.

* Formatting

* Order

* Satisfy name checker

* Add beta annotations and adjust style/naming

* Make function STUB

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-05-09 15:57:38 +02:00
Mark Langen
253882bdcb
Start work on building save data (#885)
* Start work on building save data

* Add LegoBuildingData struct to LegoBuildingManager, naming mirrors
  LegoCharacterData in LegoCharacterManager.

* 100% match of many methods in LegoBuildingManager using the struct.

* Formatting

* Add required includes post merge

* Format again

* Better follow naming conventions

* Format again again

* Also fill in template data

* Fix data

* Change braces

* Match functions, consistent style, add missing annotations, some BETA annotations

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-05-06 13:15:19 +02:00
Christian Semmler
51adf75b9b
(Refactor) Use more forward declarations (#881)
* Use more forward declarations

* Use more forward declarations

* Add more forward declarations

* Fix
2024-05-03 18:19:12 +02:00
Christian Semmler
c9db98c4c3
Fix writing/reading of game state (#834)
* Fix writing/reading of game state

* Match existing state serialization functions
2024-04-21 15:42:08 +02:00
MS
46362a0f6e
Fix some issues with annotations (#808) 2024-04-15 14:42:25 -04:00
Christian Semmler
f30ed0212b
Implement/match LegoEntity::Notify (#778) 2024-04-06 19:59:38 +02:00
Christian Semmler
70e8796af3
Implement/match LegoEntity::VTable0x3c (#680) 2024-03-16 03:20:44 +01:00
Christian Semmler
a12146f52f
Implement/match LegoEntity::VTable0x34 (#633)
* Implement/match LegoEntity::VTable0x34

* Change parameter name

* Fix order
2024-03-06 20:12:20 +01:00
Nathan M Gilbert
0e7823cedd
LegoGameState player functions (#603)
* LegoGameState player functions

* Style

* use sizeof

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-02-28 21:03:27 +01:00
Nathan M Gilbert
4d84157888
Implement Save, Load, DeleteState (#602)
* Implement Save, Load, DeleteState

* WIP

* WIP

* Match LegoGameState::Save

* Spacing

* Match LegoGameState::DeleteState()

* More match

* Match

* Move vars

* Other fixes

* Rename

* Fix error

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-02-27 21:04:17 +01:00
MS
761b120aee
CustomizeAnimFile MxVariable (#584)
* CustomizeAnimFile MxVariable

* Fixes

* Remove returns

* Add size asserts

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-02-21 21:30:02 +01:00
Christian Semmler
a29c0aca3f
Implement/match LegoOmni::Create (#556)
* Implement/match LegoOmni::Create

* Fix var

* Rename

* Fix style
2024-02-11 02:52:16 +01:00
Christian Semmler
03423b2ffa
Implement/match Infocenter::Reset (#532)
* Implement Infocenter::Reset

* Move code

* Move function

* Fix bug

* Fix another bug
2024-02-05 12:35:26 -05:00
Anonymous Maarten
9e686e2a87
cmake+ci: run clang-tidy (#512)
* cmake+ci: run clang-tidy

* Remove DESCRIPTION from LEGO1/LegoOmni.mingw.def

* Add initial .clang-tidy and fixes

* fix file perms

* Comment out DESCRIPTION

* Remove LegoEntity::~LegoEntity and MxPresenter::~MxPresenter from mingw's LEGO1.def

* Looks like clang is allergic to the libs in the directx5 SDK

* Update .clang-tidy

* Fix typo in .clang-tidy

* Attempt to generate an action error

* Revert "Attempt to generate an action error"

This reverts commit 96c4c65fedbc4102837f4bcbbb9ee83a7d14cba3.

* cmake: test with -Wparentheses + optionally with -Werror

* ci: -k0 is a Ninja argument

* Use -Werror only for msys2 builds

* cmake: only emit warnings for specific warnings

* cmake: and don't do -Werror/-WX anymore

* Fix warnings

* Fix mingw warnings

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-02-01 21:42:10 +01:00
Christian Semmler
883f3429a7
Implement/match LegoWorld::Destroy (and destructor) (#492)
* Implement/match LegoWorld::Destroy

* Match

* Match
2024-01-27 17:48:50 +01:00
Anonymous Maarten
5f413165cc
Spinoff some sources to static libraries (#484)
* cmake: use imported targets for 3rd party libs

* Fix casing of skateboard.h include

* cmake: tglrl realtime viewmanager mxgeometry

* cmake: spin off some source in static libraries

* dx5 for everyone

* ci: bump actions/checkout to v4

* move LEGO1/realtime/realtimeview.cpp to lego1 because it exports symbols

* add misc library

* Add omni library

* Return of the .def's

* Remove COMPAT_CONST in MxVideoParam::MxVideoParam

* Run clang-format

* move LEGO1/realtime/realtimeview.cpp to realtime lib

* Add 3dmanager library

* Rename .def files

* Remove incorrect deps to Omni

* Remove DLL expor decls

* Remove unnecessary library dep from ROI

* Remove COMPAT_CONST

* Move 3dmanager lib before Omni

* Remove mxgeometry lib (`geom` is actually `lego/sources/geom`, which we don't have in our decomp yet)

* viewmanager has a dependency on realtime + fix mingw's def

* Remove Smacker::Smacker from lego1 link libraries

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-01-24 21:16:29 -05:00
MS
b5a3c5feea
Enforce vtable match (#464)
* vtable enforce

* Vtable progress

* IslePathActor subclasses

* LegoState subclasses

* LegoWorld subclasses

* Presenter progress

* Remaining presenters

* All but two that need new files

* Merge into vtable branch (#3)

* Implement MxDisplaySurface::VTable0x44 (#467)

* Update mxdisplaysurface.cpp

* add arguments to header

* Fix glitched bitmaps

* WIP fixes

* Match

* Fix

* Changes

* Fixes

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>

* Implmement PoliceState::VTable0x1c (#468)

* Implmement PoliceState::VTable0x1c

* Fixes

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>

* Implement Lego3DView::Render (#470)

* Implement Lego3DView::Render

* use MxDouble

* Revert "use MxDouble"

This reverts commit a006b60e2066b79ded3e15e143a302d8fd707deb.

* Begin work on Police class (#469)

* Begin work on Police class

* Use JukeBox::e_policeStation value

* Fixes

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>

* Implement MxDisplaySurface::CreateCursorSurface (#471)

* Update mxdisplaysurface.cpp

* Fixes

* Update legovideomanager.cpp

* Match to 100%

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>

---------

Co-authored-by: Misha <106913236+MishaProductions@users.noreply.github.com>
Co-authored-by: Christian Semmler <mail@csemmler.com>
Co-authored-by: Joshua Peisach <itzswirlz2020@outlook.com>

* Police fix

* Finish

* motocycle lower case

* Update historybook.h

* Update hospitalstate.h

* Update jetski.h

* Update legoinputmanager.h

* Update legolocomotionanimpresenter.h

* Update pizza.h

* Update act3shark.h

* Update ambulancemissionstate.h

* Update bumpbouy.h

* Update doors.h

---------

Co-authored-by: Misha <106913236+MishaProductions@users.noreply.github.com>
Co-authored-by: Christian Semmler <mail@csemmler.com>
Co-authored-by: Joshua Peisach <itzswirlz2020@outlook.com>
2024-01-20 18:04:46 -05:00
MS
909c44b679
reccmp: vtable comparison (#452)
* Add vtable comparison to reccmp

* Add missing scalar deleting destructors

* Fix some vtables

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2024-01-18 14:34:14 +01:00
Misha
3c0bf7191c
implement LegoWorldPresenter deconstructor (#425)
* Implement LegoWorldPresenter::~LegoWorldPresenter

* Rename incorrect function name

* fixes

* Rename functions

* fix format
2024-01-12 23:27:07 +01:00
Christian Semmler
c47206617d
Reorganize sources and files (#414)
* Reorganize sources

* Refactor

* Remove relative paths

* Renames

* Fix gitignore

* Remove stuff

* Try fixing format script

* Fix format

* Fix format

* Fix naming script

* Test format

* Fix format
2024-01-08 10:58:49 +01:00