Skip to content

Releases

LEGOLAND port 2026-10-23 (9d9230c2)

Choose a tag to compare

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...
Read more

LEGOLAND port 2026-10-23 (3c099240)

Choose a tag to compare

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)

Choose a tag to compare

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)

Choose a tag to compare

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)

Choose a tag to compare

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)

Choose a tag to compare

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)

Choose a tag to compare

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)

Choose a tag to compare

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)

Choose a tag to compare

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)

Choose a tag to compare

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