Repository navigation
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.
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
.exesigning coming in the next release)
Changes since v0.2.0 (177 commits)
7300e5bcUpdate last published version to 0.2.0 [skip ci]58ebe280Enable the Emergency tools only in disaster mode and move to Center when the disaster ends, as the original game does95630610Remove a dispatched unit from a tile that a burning structure sets on fire, as the original XTXT overwrite does71c84504Reset dispatch units at disaster start and cycle each type's own slots, as the original game doesfd7732b8Give mouse hover and the wheel to the window under the cursor instead of the focused dialog94947e82List Place & Print objects by name, type and ID, add a Flip option, and keep the sidebar icons after an edit tool81338bceConvert window pixels to viewport space before the hover router finds the window under the cursor44ad2a28Show a half-opacity preview of the Place & Print object under the cursor, and flip the previews with the Flip optionc8f4c33cRun Place & Print edit tools through the city tool state, previews, and brushes, free and with SCURK historye5f13c96Use the city view for the Place & Print Subway-to-Rail tool, as its city tool doesfa0c942eHighlight the hovered tile for zone and de-zone tools before a dragb4d78224Shrink the New City preview to fit the dialog, and stop per-tile cache scans when one region fills the tile cacheb25d3a41Add half-size zoom levels below 10% until a large map fits the view, drawn with small sprites in larger regions0edcf945Limit demolition effects to a sample of visible tiles and decode effect events directly, so large demolitions do not exhaust texturescc35285cShow a busy box with a spinner while a city loads or a large city saves, and read cities on a worker thread1d76766cSend effect event lists from the native library as one packed integer arraya13d7a4fSample demolition dust to a spread of tiles near the view in the native library, after every random drawc64d13b5Decode land heights once per terrain drag and keep each height plan's changes apart from the map76266b14Locate disaster markers with a search of the overlay bytes instead of a check of each tileaccb4827Offer only the PNG export graphics sizes whose image fits Godot's pixel limitb0174550Enable the Emergency tool as soon as a disaster starts, from the menu or the simulationff4bd944Rotate city grids in cache-sized blocks and turn the independent grids on parallel threads9a646b14Test block rotation against the turned point of each record805c3cbfFit popup menus to screen pixels with small moves instead of empty space after the last item0f339541Shake the view for four seconds at 15 moves a second with a larger, fading earthquake shake and repeat its rumbleb50b7059Match SIMCITY.EXE disaster rules for tunnels, connection markers, dust, explosions, toxic clouds, riots, meltdowns, firestorms, and scenario monsters7e240f55Start Air Crash as a plane crash, pick menu disaster places as SIMCITY.EXE, list the debug disasters after them, and allow a disaster during another0e32519bMove the pollution and firestorm disaster points to their last seed and fire, as SIMCITY.EXE7c0e8475Document the disaster review against SIMCITY.EXE56a45b15Refuse bonds at the 25,000-scale credit rating that the budget window shows, as sc2kfix does2480569bRebuild the saved city value at the start of every simulation day, as sc2kfix does030ed078Value power plants, the zoo, the stadium, water treatment and subways at their tool costs, as sc2kfix doesf922846dRepeat a failed military base search up to ten times and keep missile sites apart, as sc2kfix doesf95b5812Load original cities with a zero FORM length from their file size and save the repaired length, as sc2kfix does068cbb42Free a demolished stadium's team, as SIMCITY.EXE and sc2kfix do63aca2e0Load and save original cities in the sc2kfix SC2X format, internally called sc2kfix798d9925Keep the sc2kfix XFIX chunk and load the tile sets that it lists with the city, as sc2kfix doesfe652ed0Add an option for the sc2kfix corrections of the original sprites, applied only without a SCURK tile seta1df7a66Mark the city centre on the Land Value map, as SIMCITY.EXE intended and sc2kfix restoresdc281eacList each scenario goal with its current value in Show Scenario Goals, as the sc2kfix scenario status window does121cfb12Show sc2kfix bad terrain in the Unusual Values layer and repair it from the Debug menu with one undob9673dc4Find and remove orphaned sign labels from the Debug menu, as sc2kfix does7fb26312Keep autosaves of the last ten minutes in the temporary folder, written on a worker thread1772bef5Clear the power flags of a demolished bridge and its banks, so a power-line bridge no longer carries power after demolition5dd5d90fAdvise energy conservation only in a city with a power plant, as sc2kfix does3242a8aaAdd the DOS colours of sc2kfix to the palette with its sprite corrections, and keep the other original sprites black theref65006e6Load sc2kfix tile sets with empty shapes and their DOS colours, and Macintosh SCURK tile setse201463eLoad DOS .TIL and Macintosh tile sets with the sc2kfix palette table and DOS coloursac2f67d8Raise a federal rate of 0 to 1 before a rate change, so TOMG_B1-B4 no longer stop on day 20e72a0d23Use the Easy disaster wait for a difficulty of 0, so TOMG_B1-B4 no longer stop on day 2343f05bebPace tornado, monster and crash demolition sounds as disaster events, not with the 15-second vehicle delay7989e458Add a Console window that shows the command line output, with a command line for future scripting1389dadcAdd multi-line console input with Shift+Enter, and save the console to a file04538c2cAdd the native scripting library, which embeds the QuickJS-ng JavaScript engine8932cd9dRun JavaScript from the console and script files, with game events and a game API for modse75023d8Add a Chrome DevTools inspector to the script runtime: console, object inspection and sources12e599dcConnect 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 reference11dc0e72Make water placed on sloped land a waterfall tile, as the original water routine doesf4e445fcConvert typed GDScript arrays and dictionaries for scripts, and turn a panic in a game function into a script error instead of a crash13b326a6Add a usage example for every script API function and eventaa369dcaExclude bundled QuickJS and test code from GitHub language stats0ba8393fLoad mods from the mods folder, each in its own sandboxed runtime, with info.json manifests, events between mods, and a Mods tab in Settingsa770fe8aAdd TypeScript declarations of the script API, with a test that keeps them complete71038bf0Show the error of a failed mod in the Mods list, and widen the version and author columns94f6e873Draw full-color HD sprite packs in the GPU city view, with animation strips, masked traffic, and an HD sprite pack settingea8859f5Show HD art for moving objects and the bulldozer brush in the GPU city viewf8f53c00Show HD art in network placement previewse92c45e2Decode Korean Johab text, newspaper grammar, and names from Korean game files1003ce22Import the DOS toolbar from TOOL.RAW and MINE.PAL5ee6288eAdd a Language setting with a Korean translation and Hangul fallback fontsd1fa107cExport city PNG images with HD art at 1, 2 or 4 pixels for each view pixelf8269b78Show HD art in the title screen city, rendering only the windows of the current and next camera shotsb00109ccShow HD art in the tool icons of the child tool palette8b9c2da8Show HD art in the query neighborhood previewb1078894Show HD art in the bridge choice previews930f1705Show HD art in the New City terrain previewc2b0d1adDocument which views show HD sprite pack art277bfdbeShow HD art in the underground view, dimmed in the dark underground view5018cee0Show HD art with the CPU renderer, painting HD regions with the palette colorse2de04b5Round the shared edges of CPU region tiles so no empty pixel line shows between themdcd184bbAdd optional HD effects on the Graphics tab: tile grid, waterfall flow, underground water flow, and palette animation8dd72577Split each native crate into a Godot-free core crate and a GDExtension bridge, and add cargo xtaskf4db056dRecord a golden corpus of saves, simulation days, new cities, images and imported packsdd31ad6eMove the ZIP codec to Rust with miniz_oxide40e858c7Move the city document codecs to Rust: SC2 container, SC2X document and metadata, sc2kfix archive, JSON and SHA-256a4b350baMove verified city saves to Rustb4db7bbcKeep a native copy of the city chunks between moving-object ticks, with process-unique chunk revisionsc2608755Record a golden corpus of new-city terrain for every layout and feature102a08daMove New City terrain generation and the empty city template to Rust, bit-equal to the GDScript terrain83be47ceMake the empty New City template and its neighbor draws native1e4145d6Move New City founding to Rust37e5a66fRead scenarios and evaluate their goals in Rust220134d6Remove scenario helpers that the native goals replacedbef08a76Add the sc2k_game crate: the simulation engine, clock and speed controller in Rust, and the dispatch command0f90fce0Run the simulation engine and speed controller in Rust; GDScript keeps their state3f669c15Move newspaper text, the DATA_USA grammar reader and the Johab codec to Rust3c2a9fe7Run the emergency dispatch tool in Rust; DispatchCommand is a facade6f8188a9Move the tool availability rules to Rust008e4ec0Move the city tool catalog to Rustd872bf47Move the sign command and the XSGN sign edit to Rust213a977cMove the query tool rules and text to Rust450b5049Move the tool kinds and the tool edit state to Rustaf3ec48fMove the disaster focus search to Rust and the pollution reference rules to the tests9adfd5e7Move the SC2X simulation checkpoint rules to Rusta6f67280Add sc2k_platform: release check, version comparison, and mod manifests in Rust3622ad5cMove the MIDI file parser, music track rules, music shuffle, and tool sound rules to Rust57bc94e8Move the wave sound gate to Rust678de0ccMove the XMI, VOC, and WAVE sound converters of the importer to Rust7038e4c1Move the asset container readers of the importer to Rustb5f3be27Move the text and newspaper record converters of the importer and the TEXT_USA reader to Rust3cd73db9Move the palette reader and the color cycle maps to Rust5f8337d2Move the pack revision rules and the media pack manifest checks to Rustbea8e533Move the SCURK MIF tile-set reader and writer to Ruste30f6293Move the DOS, Macintosh, and tile database sprite decoders of the importer to Rust7b830bdcMove the SCURK pixel edits, selection masks, and paint rules to Rustc24dcdbaMove the SCURK print page slicing, grayscale copy, and PDF assembly to Rustd609d08eMove the sc2kfix sprite correction rule to Rust72379827Move the source scan of the game importer to Rust571dae19Decode and encode indexed PNG files in Rust instead of with the Godot image loader1ee8d45cMove the portable data folder rules and the SoundFont choices to Rustc6be57bcMove the SCURK project archive codec to Rust781b5f0dMove the graphics pack importer and DOS toolbar extraction to Rustb631de7fMove the DOS and Macintosh SCURK tile set decoders to Rust86514408Add the native opensc2k binary with a CPU city view, graphics pack loader, settings reader, and game session6f2c5077Draw moving objects and disaster markers in the native city view with the painter's tile ordera82a3486Play sound effects and MIDI music in the native game through a cpal mixer1a532738Apply city tools in the native game through a Rust edit dispatcher with undof5e040eaRender whole cities from the native view and test them against hashes that match the Godot painter42d778d5Add view rotation and the data views to the native gameee314c84Run the native simulation on its own thread and publish incremental scene updates to the view314bf533Format the assets, platform, view, and app crates with the shared rustfmt width6c3594aeAdd the sc2k_ui control map and drive the native game through the shared key bindings12452787Show transient effects and the earthquake shake in the native city viewf2ce27a8Decode RGBA PNG files in Rust and show HD sprite pack art in the native city viewe8f73445Add the dark underground colors, the console log, and shell open to the native game7e01e9e8Add the fullscreen toggle, window icon, and pinch zoom to the native game, and document the native cratesf6e02203Make the macOS disk image with diskutil image where it exists, and with hdiutil on older macOS5c597982Draw a new pixel-art app icon of an isometric city block, with a script that makes the PNG, ICNS and ICO3281ee89Make the app icon an Icon Composer document so macOS 26 and later show it without a grey frame3ff3c149Repaint 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 mode3eaa238bMake the app icon colors more saturated and remove the saucer, with the city drawn larger to fill the sky23ab8893Add 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 land981a5ee8Make the icon SVGs the editable source, one named group per object in depth order, with glass towers and a bridge drawn in 3De1b8ddd2Carry the hand edits of the icon into a restored SVG generator, write the dusk layer from it, and add the SimCity 2000 helicopterc797b8c7Keep the app icon sources in game/assets/icons, out of the Godot importe79fdf35Merge remote-tracking branch 'origin/main'49e2872cAdd 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 icon07b4d8aeRemove the four HD effect options from Graphics settings and show every effect with an HD graphics pack779f8717Remove the HD palette animation: nothing draws over the animated colors of HD artf6d15117Drop the folder text above the mod list, and reword the empty mods message1eb0e01eAdd 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 correctionsd4bc7a88Give the city layer of the app icon the Icon Composer glass, as the hand edit in the archived rewrite had it3dc38f57Add a --platform option to build_desktop_release.py, so a build needs native libraries only for the chosen platforms4e963b18Make install_macos_app.py install an app of this Mac's architecture only: thin the universal Godot executable and FluidSynth, and check every binary759cdb14Sign 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 setdbfabb04Keep the SCURK dialog and Pick & Copy anchors in exported builds, and test control layouts in an exported pack73604843Pace 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 timer5c73c309Show the National Guard and parade notices with their original pictures in a modal notice, with sound 513, as SIMCITY.EXE doesd6368264Poll 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 paperd51adb3fPlay the city traffic sound and police siren from the moving-object tick at random, with their process random draws, as SIMCITY.EXE does73d9786aupdate .gitignored90f259eList the valid signing identities when MACOS_SIGNING_IDENTITY matches nonecea723bcNotarize and staple the macOS app before it goes into the disk image, so it opens offline after a player copies it out328dce64Add 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+B2037cb87Show the Macintosh Shift-click help text in dialogs that fit it, and mark what Query marks while Shift queries with another tool1400c060Leave out or change the Macintosh help sentences that do not apply to this game2f1606caLoop the disaster siren for five plays and the fire sound until the disaster ends, as SIMCITY.EXE doesd4b3e5abPlay the disaster siren three times and then stop itcf1b93c2Show 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 endsf8ec631eAdd 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 corpus513ea6bcMove the view to a disaster only when Auto-Goto is on, as SIMCITY.EXE does6b94b0c8Play sound 525 when the player sends a military unit, as SIMCITY.EXE does383dfbb0Show the forest protest notice with picture 403, and remove the treea607ae7cInstall the ALSA headers on Linux CI runners and load X11 at run time in the native game415b5a8fMake the macOS disk image with hdiutil where diskutil image has no volume name option, as on the macOS 15 runner7ad802daRetry the macOS disk image when the GitHub runner reports Resource busyf4f33738Release version 0.3.0