Skip to content

OpenSC2K 0.2.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 01:55

OpenSC2K 0.2.0

Includes Windows x64 and arm64 (standard and portable), Linux x64 and arm64, and universal macOS packages, with SHA-256 checksums.

Your own SimCity 2000 Special Edition for Windows 95 (1996) files are required. Original game assets are not included.

Installation instructions

CI passed the generated-data suite, editor parsing, and startup checks with Dummy audio. The full local release suite and cross-platform gameplay checks are not run by this workflow.

Windows packages are unsigned. The macOS app is ad-hoc signed and is not notarized. Linux x64 requires GTK 3 and WebKitGTK 4.1. The arm64 packages cannot show the newspaper.

Change Highlights:

  • Faster game engine. The simulation, file formats and rendering now run in a native Rust library, so the game is much faster, especially on large maps.
  • Maps can now be up to 4096×4096. Maps larger than 128x128 use the new SC2X save format.
  • More game versions can be imported. You can now import from the DOS, Macintosh, Windows 3.x and demo versions, and from mounted CD-ROMs.
  • New music playback. MIDI music now plays through FluidSynth, using your system's General MIDI sound set or a SoundFont you choose.
  • ARM64 builds. There are now Windows and Linux arm64 packages.
  • Rebindable controls. You can rebind keyboard and mouse controls in a new Controls tab.
  • Tool improvements. Tool groups remember your last subtool. Holding the mouse button repeats single-click placement.
  • Interface additions. Option to rename your city, Tunnels and Subways views, fixed the Zones data view, fixed neighbor connection signs.
  • The newspaper now works in every package.
  • SCURK. New graphical tile browser and better artwork copying.
  • New Debug menu, debug layers and Tile Inspector.
Changes since v0.1.3 (175 commits)
  • 2e9fc8b2 Update last published version to 0.1.3 [skip ci]
  • 9f08a6ee Fix interface click feedback across SCURK controls
  • 4b4b3c8c Remove the SCURK sidebar tile filter
  • 5d1caad6 Move the SCURK tile selector above the canvas
  • 61afb5ea Add a graphical SCURK tile browser with category filters
  • 7c7387c7 Show all SCURK tiles when the browser filter is empty
  • 70b86acf Document first-run Godot import
  • b451fa9d Clarify SCURK copying and preview matching artwork
  • 0677f529 Sync SCURK source and working list scrolling
  • 2fe466c3 Allow SCURK artwork copies between matching footprints
  • aecdbed5 Filter and animate SCURK copy previews
  • 06037faf Show zones under trees and power lines
  • d01bc91d Improve SCURK copy selection and pixel comparison
  • 6280ab57 Clarify size differences and keep copy previews animated
  • 1bfbd4fc Test suite refactor
  • b54c3742 Draw zones in place of flat ground under rubble, parks, trees, and power lines (fix #76 and #77)
  • 52ba330e Repeat single-click placement on each new tile while the button is held (fixes #80)
  • b90ebc4b Reopen each tool group on its last selected subtool (fixes #83)
  • f6c83e9b Center the city view on right click for any selected tool; add Controls settings for right and middle mouse buttons with Center Map or Context Menu (Center Map, Query Tile, Bulldoze Tile) (fixes #82)
  • 746b9186 Add experimental larger city sizes (640x640, 1024x1024)
  • 537aaa19 Speed up GPU region builds: packed per-tile culling bounds, altitude-limited spans, int-keyed tile shortcut, lazy draw grids
  • 27ae8433 Stream GPU region results from continuously fed workers; index visible and wanted regions for the scheduler
  • b7d1003b Compute GPU tile culling bounds from bound city arrays and cached sprite sizes; add overview and frame-rate options to the region benchmark
  • ab880ef2 Cut GPU tile build allocations: draws double as foreground commands, no recorder for shortcut tiles, lazy region occlusion grids
  • 5c9d2fa1 Skip repeated culling key checks within a GPU region revision; add coverage time and simulation churn to the region benchmark
  • 24d5ac21 Upload each GPU worker atlas at most once per poll
  • 5c255a9e Pass secrets to the reusable test workflow so it can check out private assets
  • 5bec970d Add the native Rust simulation library and run the growth phase in it
  • 28fd5fba Add a simulation days benchmark for supplied or generated cities
  • 6dbaf843 Run data maps, power, water, traffic, and the slice budget in the native simulation
  • 170d1c43 Run budget, demand, aftermath, industry, nation, education, graphs, milestones, scenario, and annual facility phases natively
  • 91c7b923 Run disasters, moving things, mayor approval, military proposals, and the tile recount natively
  • 24d11ef4 Run the day schedule natively in one call per day
  • 5d26e0a5 Run the city load scans natively
  • effdf972 Remove the GDScript simulation bodies that the native library replaces
  • 372c5a54 Replace the GDScript moving-thing ticks with native unit tests and run cargo tests in validation
  • 183b307d Replace the GDScript growth and trip rules with native trip queries and Rust unit tests
  • 3f82e776 Replace the GDScript data-map and disaster rules with Rust unit tests
  • 28357631 Remove the remaining duplicate GDScript rules and fold the annual budget check into the native day
  • 9a90bade Build the native simulation for each desktop package and document it
  • 1ed76be3 Format native Rust code with 140-column width
  • 126f3ea7 Fix native Rust Clippy warnings
  • 4cbfe04d Add an independent native region builder
  • 075ccc61 Enable native region preparation with parity benchmarks
  • af8cc01d Record native region benchmark results
  • 1ade7e13 Keep region draws native, cull tiles by cached bounds, and remove the GDScript region painter
  • 5780cc66 Document the native-only region builder and its benchmark results
  • 15f680f1 Decode and encode Maxis RLE chunks natively
  • 1c753d70 Rotate the city natively
  • 03e82735 Generate new-city terrain and editor streams natively
  • 92e47524 Build data map meshes and region change areas natively
  • 9a83ae51 Add Rename City to the File menu
  • 6fe13135 Add native SC2X v4 structure codecs and working-layout projection
  • 09862852 Read and write SC2X v4 archives with metadata, signs, and legacy conversion
  • 11ee1edc Run, convert, and save SC2X v4 cities in the game with checkpointed simulation state
  • 98c7f6cd Apply SC2X v4 record budgets and vehicle caps, and test the format end to end
  • e3a90f15 Save large SC2X v4 cities on a worker thread from a copied snapshot
  • 949c813e Give reused moving-object slots new SC2X identities after each simulation step
  • 88f7096f Use per-document XTHG sizes in the debug disaster action
  • af82d28b Describe SC2X v4 saves in the README
  • 242c7561 Make the Rename City dialog compact
  • eeea46ad Decode altitude and data grids natively and remove whole-map loops from large-city edits
  • fbbc68a6 Support 2048 and 4096 tile maps in SC2X v4 cities
  • b13aef10 Add a tool that repeats a city across a larger SC2X v4 map
  • c1038dd5 Keep unknown SC2X extension blocks, unresolved tile links, and placeless facility records
  • 1bd66265 Keep train identities when trains enter or leave a subway
  • 60bed5b1 Apply the SC2X object budget to monsters, tornadoes, explosions, and Maxis Man
  • 1c38673d Save the fire timer and restore SC2X random states without phase state
  • 0601407e Validate SC2X train chains and keep incomplete trains unchanged
  • 33dd3bda Keep SCLG cities in their format until the player upgrades them
  • 85b92542 Stop embedding the metadata schema in SC2X archives
  • a2c429b6 Make SCLG cities load only and convert them to SC2X version 4 on open
  • ccb94b65 Add a layered tile index that keeps facilities, markers, and moving objects apart
  • 33e30f68 Port the native simulation to the layered tile index
  • 5b6cbdab Port GDScript tools, queries, and views to the layered tile index
  • a60877b9 Run SC2X version 4 cities on the layered tile index
  • 2fe348c6 Skip the legacy sign scan for layered tile indexes
  • 192a9dc8 Add rebindable keyboard and mouse controls with a Controls tab and Use Defaults
  • f4af85fa Make tool modifier keys and SCURK editor shortcuts rebindable
  • 087db82e Make music keys bindable, drop Quit, and move Use Defaults below the Controls tab
  • 18d9567b Keep a single nightly release on a fixed nightly tag
  • 2a693551 Run CI without approval environments and read test assets with a repo secret
  • 8ee2895c Separate Controls rows, wrap long labels, name bindings in tooltips, and reopen at the top
  • 5c78d73a Create game/bin before linking the validation project so fresh checkouts load the native libraries
  • 86b2a92f Move the native library and desktop package jobs into one reusable workflow for CI and Release
  • 35fda5ef Cache Rust builds in CI and run cargo tests in a parallel job
  • 9386c0f4 Key display signatures on chunk revisions instead of hashing full map arrays
  • 22e48ff1 Build City Map window images in the native rendering library
  • ebcf2630 Make height and utility data-map values in the native rendering library
  • 30f3088f Add the native formats library and calculate CRC-32 there
  • 14b8e8f9 Decode and encode sprites, PNG, GIF, BMP and executable resources in the native formats library
  • dfecff8b Add the native audio library and render MIDI music there
  • 41c363e5 Add the Godot UIDs of the formats and audio extensions
  • a0069731 Name tile IDs, palette colors and format fields in the native rendering and formats code
  • efd8807b Color the heightmap levels with the palette of the original JavaScript OpenSC2K
  • 12906ebe Color dry heightmap land from green to red and underwater tiles by depth in blue
  • 49e2dd83 Hide the heightmap water surface and give the underwater scale a full-size legend bar
  • 95a5de3c Paint CPU city images, regions, exports and previews with the native painter
  • 81df7b33 Name tile IDs, flags and sprite offsets in the native painter
  • 2c8bc766 Composite moving sprite pixels in the native rendering library
  • a1763151 Index occlusion rectangles, plan view regions and color sign pixels in the native rendering library
  • 1964d82d Run the player tool commands in the native simulation library
  • cb7c91e1 Split the native bridges, codecs, synthesizer and tool commands into focused modules and space their blocks
  • f6bf8a51 Adjust data view grid colors and scales
  • 92c99375 Deduplicate changed region keys with a hash set
  • f092ca7d Add a City Sounds setting to reduce or turn off ambient and simulation sounds
  • 9ca08985 Limit the City Sounds setting to vehicle sounds so disasters play normally
  • 6fcd8ac8 Add native debug tile geometry, layer values, network labels, tile snapshots and draw outlines
  • 4f99fa9c Compare debug tile snapshots in place and list moving thing rows natively
  • 7f5f9f26 Add debug mode with a Debug menu, Tile Inspector, debug tile layers, render overlays, performance HUD and debug capture
  • afc6fa02 Show moving object fields on a pinned Tile Inspector tile and clear repaint highlights when they turn off
  • 5bac8ebd Add native draw labels, missing artwork tiles, chunk byte differences and tile growth inputs
  • a784ac22 Fix SC2X budget overflow in forecasts and annual settlement
  • 8bc34b62 Expect an SC2X city with saved engine state to load without a utility rescan
  • 478f9a46 Let a military proposal search for one requested base type
  • 0e034cc0 Add save verification, simulation steps, record and MISC editors, chunk browser, scenario tab, disaster preview, artwork check, growth inputs, tile grid, draw order and debug military and moving thing actions
  • 4737b44c Clear tile coordinates when the grid turns off and explain what reads MISC words
  • d590a34b Add native row ordering, first tile indices, facility bounds and building counts
  • 9ee45894 Draw the debug record tables as virtual tables that build rows only when shown
  • c664c304 Draw row lines and hover in the debug tables, and scroll them by pixels like a Tree
  • 23db1437 Hide ships and sailboats under bridge decks and keep later water from clipping them
  • a5ea370f Crash the helicopter when the Center tool clicks it, with the original hit and descent sounds
  • daf9a40b Let a shot-down helicopter fall and explode harmlessly when No Disasters is on
  • 6b34a392 Replace the Zones checkbox with a Zones data view in the sidebar list and View menu
  • 353085fe Add Show Subways to the underground View menu
  • 8b9b3bdd Add a Tunnels layer toggle to the underground sidebar and View menu
  • 06733219 Add hover tooltips to the Debug menu items
  • 2c1b9268 Decode water height and tunnel depth in the query details
  • 4170c967 Decode XTER, XTXT and ALTM bit 15 in the query details
  • 1005f93c Show neighbor connection signs at connection markers
  • a44fc1c8 Place signs at the tile center and draw them on the native pixel grid
  • 828f03b8 Draw signs above the map with a smooth font and bevel, and remove sign occlusion
  • 63425038 Launch arcologies from XBLD tiles, not XTXT riot markers
  • ec8f6725 Show building instance counts in the Tile Counts debug table
  • 6eeb4560 Stage the arcology launch: demolish 10 random launch arcologies each second
  • 38071768 Stage the arcology launch for SC2 and SCN cities too
  • c7189e3c Put Instances before On map and give the free table width to the tile name
  • 45923be2 Launch one arcology every 50 ms after a short visual fire, and hide effect dust behind structures in front
  • aef57412 Shake launch arcologies and fly them off the map, and draw launch fire at the painter depth
  • 5776bcf7 Draw upside-down exhaust flames under launching arcologies
  • 0ffa9eb3 Stand launch fire and dust on the front corner of their tiles
  • fdb0207f Pace fire scans to one per second for SC2 cities and fires from any disaster, and scan disasters once per base tick at African Swallow
  • 3a5ba2fd Drop African Swallow to Cheetah when a disaster starts, as the original does
  • e3641673 Import DOS and Macintosh graphics with the Windows palette layout and cycle colors, and read the Network Edition palette in text mode
  • 94ea5d08 Import game text, newspapers and cities from DOS, Macintosh, Windows 3.x and demo versions
  • f4d1b9e0 Play MIDI music with FluidSynth loaded at run time, with selectable bundled and custom SoundFonts
  • 175a6262 Offer the operating system General MIDI sound set as a music SoundFont choice
  • 9a8da55c Remove the bundled SoundFonts and the built-in synthesizer; play MIDI with the system sound set or a custom SoundFont
  • 4b55765a Build Windows arm64 and Linux arm64 desktop packages in CI and releases
  • 239a4890 Draw the newspaper in Godot and remove Godot WRY, so every package, including arm64, shows the newspaper
  • 0fc679a4 Soften the newspaper shadow and spin the paper six times as it opens
  • 279c99ee Import game files without case, from mounted CD-ROMs with several versions, and repair unpadded Special Edition WAV files
  • 21cf7346 Add an Import button to each Settings pack field that imports only that pack kind
  • 94603892 Compute masked tile-flag signatures and sign cell scans in native code
  • ab233b4d Read and write SC2, SCN, and SCLG FORM files in native code
  • b43a39fb Run the newspaper queue, bond, and ordinance commands in native code
  • e60460a7 Keep train IDs on their own tiles after a reverse, and turn back or remove trains that stay blocked
  • 24b9ac4b Link the static libsndfile codecs into FluidSynth on macOS and Windows, as on Linux
  • c529790e Rename the CI and nightly workflow to CI
  • bd23f75a Build libsndfile with the static FLAC define and Opus with the static MSVC runtime
  • 05190964 Start the built-in city template with a neutral growth map and month-0 budget rates, as the original does
  • 503a198a Draw new-city neighbors as the original does, with ocean neighbors for ocean and island maps, and always use the built-in city template
  • 0a380d06 Discard a synth fill that a stop or a new track overtakes
  • 4a698255 Allow 60 minutes for native package builds, so a cold macOS cache can finish
  • 809367af Repeat the new-terrain grade until no cardinal step is more than one level
  • 6c78405a Import the package project on one thread, so the headless renderer cannot lose a texture
  • 3df3fd09 Keep the validation runner tests from building and testing the native crates
  • 256dac45 Build the native crates as one Cargo workspace, so they share dependencies and build in parallel
  • 57291835 Import validation projects on one thread, so the headless renderer cannot lose a texture
  • 6073e82f Draw the selection preview as two cached meshes on its own layer, so large drag boxes do not slow the frame rate
  • 3c5d4955 Zone the eligible tiles of a drag that starts on water or a blocked tile, instead of refusing it
  • 1e2f33b8 Mirror the Nessie sprite on each display frame, as the original game does
  • 49a73b52 Add a debug action that changes the nearest sailboat into Nessie
  • c8e8228c Include the FluidR3Mono GM SoundFont in the Linux packages as the last system sound set
  • 406e485b Release version 0.2.0

Full comparison