Skip to content

OpenSC2K 0.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 09 Oct 19:27

OpenSC2K 0.3.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

Change Highlights:

  • Initial support for modding using JavaScript!
    • Embedded the QuickJS JavaScript engine, with a Console window and a game API for scripts
    • Mods load from a mods folder, each in its own sandbox, and have a Mods tab in Settings
    • Supports Chrome DevTools inspector and includes TypeScript declarations for the API
  • Moved more of the GDScript logic into Rust:
    • File format loading / saving / parsing
    • Simulation: the engine and speed controller, terrain generation
  • Added support for HD graphics (thank you @udangtang7 for contributing)
  • Initial support for localization and added a Korean translation (thank you @udangtang7 for contributing)
  • Reworked disasters and emergency dispatch to match behavior in the original game
  • Added support for the sc2kfix SC2X format
  • Fixed water placed on a slope not becoming a waterfall tile
  • Added more zoom levels for very large maps
  • Settings dialog has been reorganized a bit
  • SCURK Place & Print gained a bunch of enhancements
  • Cities now autosave every minute (up to 10 minutes)
  • Redesigned the app icon
  • macOS: Added Developer ID signing and notarization (Windows .exe signing coming in the next release)
Changes since v0.2.0 (177 commits)
  • 7300e5bc Update last published version to 0.2.0 [skip ci]
  • 58ebe280 Enable the Emergency tools only in disaster mode and move to Center when the disaster ends, as the original game does
  • 95630610 Remove a dispatched unit from a tile that a burning structure sets on fire, as the original XTXT overwrite does
  • 71c84504 Reset dispatch units at disaster start and cycle each type's own slots, as the original game does
  • fd7732b8 Give mouse hover and the wheel to the window under the cursor instead of the focused dialog
  • 94947e82 List Place & Print objects by name, type and ID, add a Flip option, and keep the sidebar icons after an edit tool
  • 81338bce Convert window pixels to viewport space before the hover router finds the window under the cursor
  • 44ad2a28 Show a half-opacity preview of the Place & Print object under the cursor, and flip the previews with the Flip option
  • c8f4c33c Run Place & Print edit tools through the city tool state, previews, and brushes, free and with SCURK history
  • e5f13c96 Use the city view for the Place & Print Subway-to-Rail tool, as its city tool does
  • fa0c942e Highlight the hovered tile for zone and de-zone tools before a drag
  • b4d78224 Shrink the New City preview to fit the dialog, and stop per-tile cache scans when one region fills the tile cache
  • b25d3a41 Add half-size zoom levels below 10% until a large map fits the view, drawn with small sprites in larger regions
  • 0edcf945 Limit demolition effects to a sample of visible tiles and decode effect events directly, so large demolitions do not exhaust textures
  • cc35285c Show a busy box with a spinner while a city loads or a large city saves, and read cities on a worker thread
  • 1d76766c Send effect event lists from the native library as one packed integer array
  • a13d7a4f Sample demolition dust to a spread of tiles near the view in the native library, after every random draw
  • c64d13b5 Decode land heights once per terrain drag and keep each height plan's changes apart from the map
  • 76266b14 Locate disaster markers with a search of the overlay bytes instead of a check of each tile
  • accb4827 Offer only the PNG export graphics sizes whose image fits Godot's pixel limit
  • b0174550 Enable the Emergency tool as soon as a disaster starts, from the menu or the simulation
  • ff4bd944 Rotate city grids in cache-sized blocks and turn the independent grids on parallel threads
  • 9a646b14 Test block rotation against the turned point of each record
  • 805c3cbf Fit popup menus to screen pixels with small moves instead of empty space after the last item
  • 0f339541 Shake the view for four seconds at 15 moves a second with a larger, fading earthquake shake and repeat its rumble
  • b50b7059 Match SIMCITY.EXE disaster rules for tunnels, connection markers, dust, explosions, toxic clouds, riots, meltdowns, firestorms, and scenario monsters
  • 7e240f55 Start Air Crash as a plane crash, pick menu disaster places as SIMCITY.EXE, list the debug disasters after them, and allow a disaster during another
  • 0e32519b Move the pollution and firestorm disaster points to their last seed and fire, as SIMCITY.EXE
  • 7c0e8475 Document the disaster review against SIMCITY.EXE
  • 56a45b15 Refuse bonds at the 25,000-scale credit rating that the budget window shows, as sc2kfix does
  • 2480569b Rebuild the saved city value at the start of every simulation day, as sc2kfix does
  • 030ed078 Value power plants, the zoo, the stadium, water treatment and subways at their tool costs, as sc2kfix does
  • f922846d Repeat a failed military base search up to ten times and keep missile sites apart, as sc2kfix does
  • f95b5812 Load original cities with a zero FORM length from their file size and save the repaired length, as sc2kfix does
  • 068cbb42 Free a demolished stadium's team, as SIMCITY.EXE and sc2kfix do
  • 63aca2e0 Load and save original cities in the sc2kfix SC2X format, internally called sc2kfix
  • 798d9925 Keep the sc2kfix XFIX chunk and load the tile sets that it lists with the city, as sc2kfix does
  • fe652ed0 Add an option for the sc2kfix corrections of the original sprites, applied only without a SCURK tile set
  • a1df7a66 Mark the city centre on the Land Value map, as SIMCITY.EXE intended and sc2kfix restores
  • dc281eac List each scenario goal with its current value in Show Scenario Goals, as the sc2kfix scenario status window does
  • 121cfb12 Show sc2kfix bad terrain in the Unusual Values layer and repair it from the Debug menu with one undo
  • b9673dc4 Find and remove orphaned sign labels from the Debug menu, as sc2kfix does
  • 7fb26312 Keep autosaves of the last ten minutes in the temporary folder, written on a worker thread
  • 1772bef5 Clear the power flags of a demolished bridge and its banks, so a power-line bridge no longer carries power after demolition
  • 5dd5d90f Advise energy conservation only in a city with a power plant, as sc2kfix does
  • 3242a8aa Add the DOS colours of sc2kfix to the palette with its sprite corrections, and keep the other original sprites black there
  • f65006e6 Load sc2kfix tile sets with empty shapes and their DOS colours, and Macintosh SCURK tile sets
  • e201463e Load DOS .TIL and Macintosh tile sets with the sc2kfix palette table and DOS colours
  • ac2f67d8 Raise a federal rate of 0 to 1 before a rate change, so TOMG_B1-B4 no longer stop on day 20
  • e72a0d23 Use the Easy disaster wait for a difficulty of 0, so TOMG_B1-B4 no longer stop on day 23
  • 43f05beb Pace tornado, monster and crash demolition sounds as disaster events, not with the 15-second vehicle delay
  • 7989e458 Add a Console window that shows the command line output, with a command line for future scripting
  • 1389dadc Add multi-line console input with Shift+Enter, and save the console to a file
  • 04538c2c Add the native scripting library, which embeds the QuickJS-ng JavaScript engine
  • 8932cd9d Run JavaScript from the console and script files, with game events and a game API for mods
  • e75023d8 Add a Chrome DevTools inspector to the script runtime: console, object inspection and sources
  • 12e599dc Connect Chrome DevTools to scripts, add budget, data map, graph, sign, view, storage and window functions to the script API, with example mods and an API reference
  • 11dc0e72 Make water placed on sloped land a waterfall tile, as the original water routine does
  • f4e445fc Convert typed GDScript arrays and dictionaries for scripts, and turn a panic in a game function into a script error instead of a crash
  • 13b326a6 Add a usage example for every script API function and event
  • aa369dca Exclude bundled QuickJS and test code from GitHub language stats
  • 0ba8393f Load mods from the mods folder, each in its own sandboxed runtime, with info.json manifests, events between mods, and a Mods tab in Settings
  • a770fe8a Add TypeScript declarations of the script API, with a test that keeps them complete
  • 71038bf0 Show the error of a failed mod in the Mods list, and widen the version and author columns
  • 94f6e873 Draw full-color HD sprite packs in the GPU city view, with animation strips, masked traffic, and an HD sprite pack setting
  • ea8859f5 Show HD art for moving objects and the bulldozer brush in the GPU city view
  • f8f53c00 Show HD art in network placement previews
  • e92c45e2 Decode Korean Johab text, newspaper grammar, and names from Korean game files
  • 1003ce22 Import the DOS toolbar from TOOL.RAW and MINE.PAL
  • 5ee6288e Add a Language setting with a Korean translation and Hangul fallback fonts
  • d1fa107c Export city PNG images with HD art at 1, 2 or 4 pixels for each view pixel
  • f8269b78 Show HD art in the title screen city, rendering only the windows of the current and next camera shots
  • b00109cc Show HD art in the tool icons of the child tool palette
  • 8b9c2da8 Show HD art in the query neighborhood preview
  • b1078894 Show HD art in the bridge choice previews
  • 930f1705 Show HD art in the New City terrain preview
  • c2b0d1ad Document which views show HD sprite pack art
  • 277bfdbe Show HD art in the underground view, dimmed in the dark underground view
  • 5018cee0 Show HD art with the CPU renderer, painting HD regions with the palette colors
  • e2de04b5 Round the shared edges of CPU region tiles so no empty pixel line shows between them
  • dcd184bb Add optional HD effects on the Graphics tab: tile grid, waterfall flow, underground water flow, and palette animation
  • 8dd72577 Split each native crate into a Godot-free core crate and a GDExtension bridge, and add cargo xtask
  • f4db056d Record a golden corpus of saves, simulation days, new cities, images and imported packs
  • dd31ad6e Move the ZIP codec to Rust with miniz_oxide
  • 40e858c7 Move the city document codecs to Rust: SC2 container, SC2X document and metadata, sc2kfix archive, JSON and SHA-256
  • a4b350ba Move verified city saves to Rust
  • b4db7bbc Keep a native copy of the city chunks between moving-object ticks, with process-unique chunk revisions
  • c2608755 Record a golden corpus of new-city terrain for every layout and feature
  • 102a08da Move New City terrain generation and the empty city template to Rust, bit-equal to the GDScript terrain
  • 83be47ce Make the empty New City template and its neighbor draws native
  • 1e4145d6 Move New City founding to Rust
  • 37e5a66f Read scenarios and evaluate their goals in Rust
  • 220134d6 Remove scenario helpers that the native goals replaced
  • bef08a76 Add the sc2k_game crate: the simulation engine, clock and speed controller in Rust, and the dispatch command
  • 0f90fce0 Run the simulation engine and speed controller in Rust; GDScript keeps their state
  • 3f669c15 Move newspaper text, the DATA_USA grammar reader and the Johab codec to Rust
  • 3c2a9fe7 Run the emergency dispatch tool in Rust; DispatchCommand is a facade
  • 6f8188a9 Move the tool availability rules to Rust
  • 008e4ec0 Move the city tool catalog to Rust
  • d872bf47 Move the sign command and the XSGN sign edit to Rust
  • 213a977c Move the query tool rules and text to Rust
  • 450b5049 Move the tool kinds and the tool edit state to Rust
  • af3ec48f Move the disaster focus search to Rust and the pollution reference rules to the tests
  • 9adfd5e7 Move the SC2X simulation checkpoint rules to Rust
  • a6f67280 Add sc2k_platform: release check, version comparison, and mod manifests in Rust
  • 3622ad5c Move the MIDI file parser, music track rules, music shuffle, and tool sound rules to Rust
  • 57bc94e8 Move the wave sound gate to Rust
  • 678de0cc Move the XMI, VOC, and WAVE sound converters of the importer to Rust
  • 7038e4c1 Move the asset container readers of the importer to Rust
  • b5f3be27 Move the text and newspaper record converters of the importer and the TEXT_USA reader to Rust
  • 3cd73db9 Move the palette reader and the color cycle maps to Rust
  • 5f8337d2 Move the pack revision rules and the media pack manifest checks to Rust
  • bea8e533 Move the SCURK MIF tile-set reader and writer to Rust
  • e30f6293 Move the DOS, Macintosh, and tile database sprite decoders of the importer to Rust
  • 7b830bdc Move the SCURK pixel edits, selection masks, and paint rules to Rust
  • c24dcdba Move the SCURK print page slicing, grayscale copy, and PDF assembly to Rust
  • d609d08e Move the sc2kfix sprite correction rule to Rust
  • 72379827 Move the source scan of the game importer to Rust
  • 571dae19 Decode and encode indexed PNG files in Rust instead of with the Godot image loader
  • 1ee8d45c Move the portable data folder rules and the SoundFont choices to Rust
  • c6be57bc Move the SCURK project archive codec to Rust
  • 781b5f0d Move the graphics pack importer and DOS toolbar extraction to Rust
  • b631de7f Move the DOS and Macintosh SCURK tile set decoders to Rust
  • 86514408 Add the native opensc2k binary with a CPU city view, graphics pack loader, settings reader, and game session
  • 6f2c5077 Draw moving objects and disaster markers in the native city view with the painter's tile order
  • a82a3486 Play sound effects and MIDI music in the native game through a cpal mixer
  • 1a532738 Apply city tools in the native game through a Rust edit dispatcher with undo
  • f5e040ea Render whole cities from the native view and test them against hashes that match the Godot painter
  • 42d778d5 Add view rotation and the data views to the native game
  • ee314c84 Run the native simulation on its own thread and publish incremental scene updates to the view
  • 314bf533 Format the assets, platform, view, and app crates with the shared rustfmt width
  • 6c3594ae Add the sc2k_ui control map and drive the native game through the shared key bindings
  • 12452787 Show transient effects and the earthquake shake in the native city view
  • f2ce27a8 Decode RGBA PNG files in Rust and show HD sprite pack art in the native city view
  • e8f73445 Add the dark underground colors, the console log, and shell open to the native game
  • 7e01e9e8 Add the fullscreen toggle, window icon, and pinch zoom to the native game, and document the native crates
  • f6e02203 Make the macOS disk image with diskutil image where it exists, and with hdiutil on older macOS
  • 5c597982 Draw a new pixel-art app icon of an isometric city block, with a script that makes the PNG, ICNS and ICO
  • 3281ee89 Make the app icon an Icon Composer document so macOS 26 and later show it without a grey frame
  • 3ff3c149 Repaint the app icon as vector art after the SimCity 2000 box: the city, bay bridge, monorail and pink-ringed saucer, with a dusk version for dark mode
  • 3eaa238b Make the app icon colors more saturated and remove the saucer, with the city drawn larger to fill the sky
  • 23ab8893 Add detail to the app icon: a street grid aligned with the buildings, blocks of houses, shops, offices and parks, cars, boats and roof details; keep every building on land
  • 981a5ee8 Make the icon SVGs the editable source, one named group per object in depth order, with glass towers and a bridge drawn in 3D
  • e1b8ddd2 Carry the hand edits of the icon into a restored SVG generator, write the dusk layer from it, and add the SimCity 2000 helicopter
  • c797b8c7 Keep the app icon sources in game/assets/icons, out of the Godot import
  • e79fdf35 Merge remote-tracking branch 'origin/main'
  • 49e2872c Add tools/install_macos_app.py to build, export and install the app for this Mac in one step, and give exported apps the Icon Composer icon
  • 07b4d8ae Remove the four HD effect options from Graphics settings and show every effect with an HD graphics pack
  • 779f8717 Remove the HD palette animation: nothing draws over the animated colors of HD art
  • f6d15117 Drop the folder text above the mod list, and reword the empty mods message
  • 1eb0e01e Add a UI settings tab, put Renderer, HD graphics, sc2kfix corrections and dark underground on the Graphics tab, and allow HD graphics only with a loaded HD pack and without sc2kfix corrections
  • d4bc7a88 Give the city layer of the app icon the Icon Composer glass, as the hand edit in the archived rewrite had it
  • 3dc38f57 Add a --platform option to build_desktop_release.py, so a build needs native libraries only for the chosen platforms
  • 4e963b18 Make install_macos_app.py install an app of this Mac's architecture only: thin the universal Godot executable and FluidSynth, and check every binary
  • 759cdb14 Sign the macOS app with a Developer ID and notarize the disk image when signing settings are present; require it for stable releases and use it for nightlies when the secrets are set
  • dbfabb04 Keep the SCURK dialog and Pick & Copy anchors in exported builds, and test control layouts in an exported pack
  • 73604843 Pace every disaster, fires included, as SIMCITY.EXE does: disaster mode drops every other due tick except at African Swallow, and a save keeps the dropped tick instead of the fire timer
  • 5c73c309 Show the National Guard and parade notices with their original pictures in a modal notice, with sound 513, as SIMCITY.EXE does
  • d6368264 Poll the mayor approval each time a newspaper opens, as SIMCITY.EXE does: the poll's top complaint fills the opinion column, and a parade notice comes before the paper
  • d51adb3f Play the city traffic sound and police siren from the moving-object tick at random, with their process random draws, as SIMCITY.EXE does
  • 73d9786a update .gitignore
  • d90f259e List the valid signing identities when MACOS_SIGNING_IDENTITY matches none
  • cea723bc Notarize and staple the macOS app before it goes into the disk image, so it opens offline after a player copies it out
  • 328dce64 Add the hold-key shortcuts of the Macintosh and DOS versions: hold B to bulldoze and Option to center with any tool, Shift-click to query with any tool, and Shift-click a toolbar button or the status bar for its original help text; Budget moves to Command+B
  • 2037cb87 Show the Macintosh Shift-click help text in dialogs that fit it, and mark what Query marks while Shift queries with another tool
  • 1400c060 Leave out or change the Macintosh help sentences that do not apply to this game
  • 2f1606ca Loop the disaster siren for five plays and the fire sound until the disaster ends, as SIMCITY.EXE does
  • d4b3e5ab Play the disaster siren three times and then stop it
  • cf1b93c2 Show only the original status messages in the status bar, and check the city status when a city opens, a new city starts, or a disaster ends
  • f8ec631e Add a fixed land-value base of 32 in place of the original's uncleared scratch grid, and record the new day hashes in the golden corpus
  • 513ea6bc Move the view to a disaster only when Auto-Goto is on, as SIMCITY.EXE does
  • 6b94b0c8 Play sound 525 when the player sends a military unit, as SIMCITY.EXE does
  • 383dfbb0 Show the forest protest notice with picture 403, and remove the tree
  • a607ae7c Install the ALSA headers on Linux CI runners and load X11 at run time in the native game
  • 415b5a8f Make the macOS disk image with hdiutil where diskutil image has no volume name option, as on the macOS 15 runner
  • 7ad802da Retry the macOS disk image when the GitHub runner reports Resource busy
  • f4f33738 Release version 0.3.0

Full comparison