Repository navigation
Releases
LEGOLAND port 2026-10-23 (9d9230c2)
Built from commit 9d9230c. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-23-9d9230c2.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-23-9d9230c2.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-23-9d9230c2.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-22-08fd3661
- Decomp merge, step 1: the decomp's renames applied to the port before merging
- castle: keep only the maths constants in globals.c, leave the copied tables blank
- castle: built-in sleeper/post models, clip planes and lists, surface buffer from the original data
- castle: initialise castle data with the original values
- castle: InitRailTubeMesh 100%
- castle: BisectTrainSegmentEnd 83 -> 92%, StepTrainToSegmentEnd 88 -> 90%
- castle: FindPathPosAtRange{Behind,Ahead} 100%
- castle: initialise the five piece class tables with the original data
- ClearRecordedDepthSpans: pointers to the current source edge and record entry: 98.11% -> 100.00%
- castle: file overview, last annotations, train speed/step/seat names
- castle: square-track editor, track drawing, heights, walker geometry and bogies explained; 58 names
- castle: lego_invsqrtf computes sqrt: rename it lego_sqrtf (with HASM, init and tables)
- castle: view, lighting, save/load explained; lego_sqrtf is in fact 1/sqrt; 30 names
- castle: castle object, its track, depth buffer and visitor queue explained; 37 names
- castle: curve stretches explained; 26 names, curve vtable and views
- castle: software renderer explained; 41 names, LmsFile triangle lists
- castle: train physics, cars and dispatch explained; 21 names, train motion/save fields
- castle: track pieces, placement and heights explained; 26 names, 21 field renames
- Name 8 report goal setter table, flume shape init and barrel lists, jungle/boating water neighbour masks and corner fill, pop-up OK key
- Name 9 data: z-buffer image sprite, interval hint bubble timer, music thread ready flag, advisor help flags, objective hint timer
- Name 9 game interface button handlers, default OK/cancel keys, bloke tiredness, park entry and brolly actions
- PickQueueTurn: 16-byte step buffer, signed random byte, ternary for the 1-or-2 turn: 70.73% -> 80.39%
- castle: drop the now unused BisectPair
- BisectTrainSegmentEnd: the integrator state is the 16-byte BisectOut, as in StepTrainToSegmentEnd: 71.35% -> 83.04%
- Name 25 data: advisor anim state, texture count, visitor happiness goal, bridge offsets, free play panel lists, path edge counts
- Name 20 map coverage counters and path-scenery percentage, icon group callbacks, AVI audio flags
- Name 57 data: controller key/button masks and states, drag tiles, OK/cancel key handlers, report goals, AVI audio state
- Name 14 bloke low-level action handlers (the action table) and their tile helpers
- LoadBmpIntoImage: test the stored data pointer, take dst from it in the 8-bit branch: 88.65% -> 89.71%
- Name 18 ride node updaters, list frees, pop-up info buttons, object description loader, element dialog
- OpenAviAnim: early returns, one per failure, in the original's order: 91.98% -> 100.00%
- Name 6 A* path search: the second node list is the closed list, not a free list
- Name 12 in free play, level unload, objectives, worker pathfinding and space tower seats
- Name 19 in progress/tutorial and save-game screens, icons, driving-school waypoints, shop browsing
- Name 24 in the castle coaster: shade ramps, footprints, edge/box helpers, screen-rect projection, visitor model, frame counters
- Name 14 in options, interface and pop-ups: OK/cancel/exit check box handlers, pop-up message box
- Name 20 data: reciprocal tables, render item pools, visitor colours/textures, queue path tables, advice/help tables
- Name 6 data: interval speech prefixes, level-end movie, script command table, 16-bit palette, temple slide path names
- Name 24 data: log flume piece elements, saved volumes/screen state, text buffers, challenge score goals
- Name 20 data: rider render lists, coaster file line counts, game timer bases, park entrance/exit offsets, button state
- Name 32 data: ride sprite infos, BinV/rider-sprite tables, AVI audio state, interval-screen text, bloke letters, space tower tables
- Name 28 data: active rides and layers, BinV/sprite tables, render lists, ride sprite infos, music buffers, work-order counts
- Name 20 data: ride layers and active rides, title/pop-up icons, render and path-node lists, piece-class table
- Name 22 in the castle coaster: piece direction index, segment counts, vec-math setup, polygon clipping, map objects, link list
- FUN_00484790: keep the RF flag byte in the low byte of a dword slot: 97.62% -> 100.00%
- ResetSpaceTowerCar: plain seat stores in the original order: 83.93% -> 100.00%
- Name 14 in free play costs, movie pool, briefing, script loading and hover
- Name 17 in icons, free play, earth slide, catapult and save strings
- Name 20 in jungle cruise, boating school, workers, space tower and pathfinding
- Name 11 driving-school cars, traffic-light check, bloke helpers
- Name 107 in the castle coaster: piece placement, train state and drawing, save/load, height interpolation, integrator helpers
- Log flume entrance: drop permuter temporaries and register hints
- RenderLogFlumeCorner: drop the volatile count; declare count before par: 85.23% -> 100.00%
- DrawLogFlumeBarrel: convert the bob offset explicitly so it is added with fiadd: 81.27% -> 82.35%
- FUN_0040adb0: fill the rect in field order: 58.21% -> 100.00%
- GetFlumeSpecialCornerConnections: uniform per-corner case bodies: 74.67% -> 100.00%
- Drop the now unused struct FlumeOut
- GetLogFlumeHoldUpConnections: write as the sibling connection builders: 56.76% -> 100.00%
- Name 51 in log flume: piece chains, neighbour join/detach, special corners, tunnel/csaw/hold-up/drop pieces, drop slots
- DrivingSchoolUpdate: drop permuter copy chains, register hint and dead temporaries
- LogFlumeEntranceUpdate: drop permuter temp and register hints
- BuildLogFlumeDropNodes: replace permuter output with plain C
- Name 103 in log flume, driving school roads/traffic lights/pumps, ride queues and help bubbles
- Name 57 more: castle coaster state and visitor lifecycle, train positioning, RK4/finite-difference numerics, boat/jungle path search, dialog widgets, icon scrolling
- Name 52 more: ride start/reset cycles and SFX helpers, ride node lists, rider lookup by tile, speech ring buffers, path/text/sample helpers
- Name 85 functions and globals: coaster train/cars/seats/visitors, path segments, maths helpers, ride slots, script sections, object instances
- Name the clip-plane helpers, the movie frame blitter and the anim layout offset
- Attempt notes: under-50 functions tried on 2026-10-21
- ClampScrollPosition in plain C: tileW <<= 7 instead of *= 0x80 (0x00461290): 44.44% -> 62.11%
- FUN_00465850 in plain C: indexed 2x2 inner loop, row loop from height - 1 (0x00465850): 47.62% -> 57.92%
- Attempt notes: 7 functions tried on 2026-10-21 (no gain)
- LoadObjectClassAliasElements 100%: the alias table is .data, not const (0x004809d0): 98.63% -> 100.00%
- CheckWorkerOnMouseStatus: attempt notes (ebp-held constant 1, 2026-10-21)
- lego_invsqrtf_init 100%: the invsqrt tables are adjacent initialised data in castle.c (0x00426b10): 97.83% -> 100.00%
- Water works: name every function, global and parameter; Bloke.field_73 is target_dir
- FUN_00418710 in plain C: rect.x1/y1 are the full sums, not rect.x0/y0 + 3 (0x00418710): 82.69% -> 100.00%
- FUN_0046f2e0 in plain C: the right-button test that keeps the branch (0x0046f2e0): 70.59% -> 100.00%
- ObjectiveEvent: field_28/field_2c are int like field_30/field_34 (signed rect compares in ScriptEventClear); attempt notes
- SpeechParseWavHeader in plain C: the chunk scan is a do/while(1) with the data tag as break (0x00498420): 93.19% -> 100.00%
- MarkConnectedNodes: indexed neighbour loop (0x004829c0): 72.55% -> 74.51%
- FreePlayObjectList in plain C: list is uninitialised for an unknown page, as in the original (0x0048b2a0): 81.50% -> 100.00%
- LoadPos in plain C: indexed frames[j] and mat[row][col] loops, no volatile (0x0043f660): 66.91% -> 100.00%
- RenderMapScreenFrame in plain C: the hit info is a struct HoverInfo = {1}, LastMapClickTicks is an int (0x00459360): 63.96% -> 100.00%
- IsFootprintClear 100% in plain C: the offset is a struct Point passed by value (0x00457970): 87.80% -> 100.00%
- Back to the best pre-asm C for 7 functions (PrintCertificate 38.31 -> 89.11, RestoreBaseMap 70.59 -> 95.65, RES_OpenVolume 92.37 -> 97.18, UpdateControllerFromMouseData 82.73 -> 93.21, LoadPos 42.19 -> 66.91, Leg/ArmColour 25 -> 27.78/30.30)
- Withdraw the documented-asm rule: the 22 compiler-choice naked __asm functions go back to their C
- RestoreBaseMap 100%: documented naked asm for the dead flag test (0x0045da60): 95.65% -> 100.00%
- docs: UpdateSampleVolume and CarouselUpdate attempts (no change)
- FUN_0046f2e0 100%: documented naked asm for the icons' default event handler (0x0046f2e0): 70.59% -> 100.00%
- GetLegColourOfBloke / GetArmColourOfBloke 100%: documented naked asm (0x004431f0 27.78% -> 100%, 0x00443220 30.30% -> 100%)
- RES_OpenVolume 100%: documented naked asm, strings named (0x00489750): 97.18% -> 100.00%
- CoptersPlaceRider: case bodies on the right index values (jump table order): 81.61% -> 82.76%
- docs: UpdateEditSelection attempts log (0x00452030 matched)
- Type the edit selection rect as struct MapRect SelectionRect, name UpdateEditSelection (0x00452030): 98.16% -> 100.00%
- Match and name UpdateLogFlumeEntranceEntry in plain C
- Match and name HTBubbleHelpWithMood i...
LEGOLAND port 2026-10-23 (3c099240)
Built from commit 3c09924. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-23-3c099240.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-23-3c099240.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-23-3c099240.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-23-9d9230c2
- Decomp merge, step 1: the decomp's renames up to ed27866 applied to the port
- Record matching attempts: RenderSpider field_35 compare split, RenderSpinningBarrels seat copy order
- RemObjFromMap: sound block store order, flag-word pointer, footprint bounds: 85.65% -> 87.05%
- LegoShop2Update: browse spot 2 walks on its own, the other two share the walk: 46.68% -> 76.66%
- LegoShop2Update: browse spot 2 is (x-3, y), as in the original: 75.11% -> 46.68%
- Record matching attempts: LegoShop2Update behaviour bug, loop hoisting, tail layouts
- MusicThreadProc: declare RailTubeMesh in castle.h, not globals.h: 99.89% -> 100.00%
- Name the script line counter and document remaining matching checks
- HTBubbleHelp: restore the intermediate rectangle before clamping: 76.47% -> 100.00%
- Name and annotate 32 ride, MIDI, worker and interface functions
- Document unlanded-function checks and the resolved save-name match
- EnterSaveGameDetails: restore the shared rectangle and precomputed hover bounds: 90.91% -> 100.00%
- Name and annotate 33 flume, rendering, profile and application functions
- castle: RecordDepthSpans 64.5 -> 82%
- castle: BuildTrackPieceCurves without the permuter's temporaries
LEGOLAND port 2026-10-22 (08fd3661)
Built from commit 08fd366. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-22-08fd3661.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-22-08fd3661.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-22-08fd3661.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-20-6dd7128b
- Web: run the game on a thread of its own, so the page works in Safari (iPhones, iPads)
- miniwin music: look for a missing gm.dls once, not 292 times
LEGOLAND port 2026-10-20 (cf27fad7)
Built from commit cf27fad. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-20-cf27fad7.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-20-cf27fad7.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-20-cf27fad7.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-19-12096a6c
- Touch screens: placing an object, a finger aims it and a tap on it builds it
LEGOLAND port 2026-10-20 (6dd7128b)
Built from commit 6dd7128. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-20-6dd7128b.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-20-6dd7128b.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-20-6dd7128b.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-20-cf27fad7
- Touch screens: placing with a finger works in the park (it never switched on)
LEGOLAND port 2026-10-19 (12096a6c)
Built from commit 12096a6. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-19-12096a6c.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-19-12096a6c.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-19-12096a6c.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-19-0e5a3bd1
- Loading on the web about 3 times faster: read-only files through a block cache, and read as access handles
LEGOLAND port 2026-10-19 (0e5a3bd1)
Built from commit 0e5a3bd. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-19-0e5a3bd1.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-19-0e5a3bd1.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-19-0e5a3bd1.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-18-49ea7e52
- The frame limiter and the movie player nap instead of spinning (Linux, Android, the web)
- Movies on the web: read ahead 256 KB at a time; a frame took 4.6 ms there, now about 1 ms
- The string table's id buffer one byte short; two undefined behaviours in miniwin (found by AddressSanitizer)
LEGOLAND port 2026-10-18 (f0a64348)
Built from commit f0a6434. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-18-f0a64348.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-18-f0a64348.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-18-f0a64348.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-18-daecea3e
- Touch screens: taps click where they touch, no pointer under the finger, the keyboard opens for names (web and Android)
LEGOLAND port 2026-10-18 (daecea3e)
Built from commit daecea3. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-18-daecea3e.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-18-daecea3e.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-18-daecea3e.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes
The first release published here; the earlier ones went out by hand.
LEGOLAND port 2026-10-18 (9179406e)
Built from commit 9179406. You need your own copy of LEGOLAND (the CD or its image); no game data is included. The first start installs the game from it.
| Platform | File |
|---|---|
| Web | no download: play in your browser |
| Windows 10/11 | LEGOLAND-port-windows-2026-10-18-9179406e.zip: unzip, start LEGOLAND-port.exe |
| Linux x86_64 (glibc 2.31+) | LEGOLAND-port-linux-x86_64-2026-10-18-9179406e.tar.gz: unpack, start legoland |
| Android 7.0+ | LEGOLAND-port-android-2026-10-18-9179406e.apk: install, then choose the CD image |
The -symbols files are only for reading crash reports.
Changes since 2026-10-18-f0a64348
- Touch screens: a finger drags the object lists, two fingers move around the park