Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package CorsixTH for openSUSE:Factory checked in at 2026-09-01 15:49:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/CorsixTH (Old) and /work/SRC/openSUSE:Factory/.CorsixTH.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "CorsixTH" Tue Sep 1 15:49:01 2026 rev:16 rq:1374997 version:0.70.1 Changes: -------- --- /work/SRC/openSUSE:Factory/CorsixTH/CorsixTH.changes 2026-08-17 17:02:31.261511664 +0200 +++ /work/SRC/openSUSE:Factory/.CorsixTH.new.1265/CorsixTH.changes 2026-09-01 15:50:30.106246720 +0200 @@ -1,0 +2,11 @@ +Fri Aug 28 14:16:32 UTC 2026 - Carsten Ziepke <[email protected]> + +- Update to version 0.70.1: + * Bug Fixes + - Prevent game crashes when using a MIDI API, such as JACK + - Prevent game crashes when checking for missing staff in rooms, + such as Psychiatry + - Prevented a game crash with the bottom drawer when loading a + game from 0.69.2 or earlier + +------------------------------------------------------------------- Old: ---- CorsixTH-0.70.0.tar.gz New: ---- CorsixTH-0.70.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ CorsixTH.spec ++++++ --- /var/tmp/diff_new_pack.3xpIaz/_old 2026-09-01 15:50:30.647265595 +0200 +++ /var/tmp/diff_new_pack.3xpIaz/_new 2026-09-01 15:50:30.648265630 +0200 @@ -17,7 +17,7 @@ Name: CorsixTH -Version: 0.70.0 +Version: 0.70.1 Release: 0 Summary: Theme Hospital clone License: MIT ++++++ CorsixTH-0.70.0.tar.gz -> CorsixTH-0.70.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CMakeLists.txt new/CorsixTH-0.70.1/CMakeLists.txt --- old/CorsixTH-0.70.0/CMakeLists.txt 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CMakeLists.txt 2026-08-26 21:56:02.000000000 +0200 @@ -72,6 +72,10 @@ enable_testing() endif() +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + if(MINGW) set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/CMakeLists.txt new/CorsixTH-0.70.1/CorsixTH/CMakeLists.txt --- old/CorsixTH-0.70.0/CorsixTH/CMakeLists.txt 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/CMakeLists.txt 2026-08-26 21:56:02.000000000 +0200 @@ -18,6 +18,15 @@ add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() +include(CheckCXXSourceCompiles) +check_cxx_source_compiles(" +#include <atomic> +int main() { + std::atomic<double> d {0.0}; + return static_cast<int>(d.load()); +} +" ATOMIC_BUILTIN) + set(CORSIX_TH_SEARCH_LOCAL_DATADIRS ${SEARCH_LOCAL_DATADIRS}) set(CORSIX_TH_INTERPRETER_NAME CorsixTH.lua) @@ -93,6 +102,10 @@ set_target_properties(CorsixTH PROPERTIES OUTPUT_NAME corsix-th) endif() +if(NOT ATOMIC_BUILTIN) + target_link_libraries(CorsixTH_lib PRIVATE atomic) +endif() + # Generate source files list # Note: Done after generating targets add_subdirectory(${PROJECT_SOURCE_DIR}/Src) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/Lua/api_version.lua new/CorsixTH-0.70.1/CorsixTH/Lua/api_version.lua --- old/CorsixTH-0.70.0/CorsixTH/Lua/api_version.lua 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/Lua/api_version.lua 2026-08-26 21:56:02.000000000 +0200 @@ -32,4 +32,4 @@ #endif /*]] --*/ -return 2716; +return 2717; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/Lua/app.lua new/CorsixTH-0.70.1/CorsixTH/Lua/app.lua --- old/CorsixTH-0.70.0/CorsixTH/Lua/app.lua 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/Lua/app.lua 2026-08-26 21:56:02.000000000 +0200 @@ -28,7 +28,7 @@ -- and add compatibility code in afterLoad functions -- Recommended: Also replace/Update the summary comment -local SAVEGAME_VERSION = 253 -- 0.70.0 +local SAVEGAME_VERSION = 254 -- 0.70.1 class "App" @@ -1725,6 +1725,7 @@ {major = 0, minor = 70, revision = 0, patch = "-rc1", version = 251}, {major = 0, minor = 70, revision = 0, patch = "-rc2", version = 252}, {major = 0, minor = 70, revision = 0, patch = "", version = 253}, + {major = 0, minor = 70, revision = 1, patch = "", version = 254}, } --! Retrieve the current savegame version as defined in the application. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/Lua/audio.lua new/CorsixTH-0.70.1/CorsixTH/Lua/audio.lua --- old/CorsixTH-0.70.0/CorsixTH/Lua/audio.lua 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/Lua/audio.lua 2026-08-26 21:56:02.000000000 +0200 @@ -197,15 +197,21 @@ function Audio:initMidiPlayer() if self.midi_player then - self.midi_player:close() + pcall(self.midi_player.close, self.midi_player) self.midi_player = nil end if TH.GetCompileOptions().midi_device and self.app.config.midi_api then - self.midi_player = TH.midiPlayer( + local midi_ok, midi_player = pcall( + TH.midiPlayer, self.app.config.midi_api, self.app.config.midi_port, self.app.config.midi_sysex_master_volume) + if midi_ok then + self.midi_player = midi_player + else + print("Failed to create midi player: " .. midi_player) + end end end @@ -667,7 +673,7 @@ end SDL.audio.stopMusic() if self.midi_player then - self.midi_player:stop() + pcall(self.midi_player.stop, self.midi_player) end self.background_music = nil @@ -701,8 +707,14 @@ local data = self:getFileData(index) if info.is_xmi then if self.midi_player then - self.midi_player:setVolume(self.app.config.music_volume) - self.midi_player:playXmi(data) + local ok, err = pcall(self.midi_player.setVolume, self.midi_player, self.app.config.music_volume) + if ok then + ok, err = pcall(self.midi_player.playXmi, self.midi_player, data) + end + if not ok then + print("Failed to play midi: " .. err) + return + end -- info.music has to be equal to background_music and both values need -- to be truthy and unique for the jukebox to detect the track. Using diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/Lua/dialogs/bottom_panel.lua new/CorsixTH-0.70.1/CorsixTH/Lua/dialogs/bottom_panel.lua --- old/CorsixTH-0.70.0/CorsixTH/Lua/dialogs/bottom_panel.lua 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/Lua/dialogs/bottom_panel.lua 2026-08-26 21:56:02.000000000 +0200 @@ -442,25 +442,6 @@ self.ui.hospital.message_popup = true end - local --[[persistable:bottom_panel_message_window_close]] function onClose(this_icon) - local this_icon_index - for i, icon in ipairs(self.message_windows) do - -- If icon position found - if this_icon_index ~= nil then - -- Shift all icons that are on the right to the left - -- The '_factoryIconWitdh()' call is used for compatibility with 0.69 saves and older - -- where FACTORY_ICON_WIDTH was not yet declared when the closure was created. - icon:setXLimit(1 + (i - 2) * self._factoryIconWitdh()) - elseif icon == this_icon then - this_icon_index = i - end - end - if this_icon_index then - table.remove(self.message_windows, this_icon_index) - end - self:deleteMessage(nil, this_icon) - end - local message_info = { type = type, message = message, @@ -472,11 +453,7 @@ if self:canQueueFax(message_info) then self.message_queue[#self.message_queue + 1] = message_info - -- Create the drawer message icon, note this does not show it to the player on creation. - local drawer_icon = UIMessage(self.ui, 175, nil, - onClose, message_info.type, message_info.message, message_info.owner, - message_info.timeout, message_info.default_choice, message_info.callback) - message_info["drawer_icon"] = drawer_icon + self:_initMessageWithDrawerIcon(message_info) -- Сreate reference to message in owner if owner then owner.message = message @@ -490,6 +467,35 @@ return FACTORY_ICON_WIDTH end +--! Initialise fax message with an UIMessage object. +--!param message_info (table) table with message metadata. +function UIBottomPanel:_initMessageWithDrawerIcon(message_info) + local --[[persistable:bottom_panel_message_window_close]] function onClose(this_icon) + local this_icon_index + for i, icon in ipairs(self.message_windows) do + -- If icon position found + if this_icon_index ~= nil then + -- Shift all icons that are on the right to the left + -- The '_factoryIconWitdh()' call is used for compatibility with 0.69 saves and older + -- where FACTORY_ICON_WIDTH was not yet declared when the closure was created. + icon:setXLimit(1 + (i - 2) * self._factoryIconWitdh()) + elseif icon == this_icon then + this_icon_index = i + end + end + if this_icon_index then + table.remove(self.message_windows, this_icon_index) + end + self:deleteMessage(nil, this_icon) + end + + -- Create the drawer message icon, note this does not show it to the player on creation. + local drawer_icon = UIMessage(self.ui, 175, nil, + onClose, message_info.type, message_info.message, message_info.owner, + message_info.timeout, message_info.default_choice, message_info.callback) + message_info["drawer_icon"] = drawer_icon +end + --[[ A fax can be queued if the event the fax causes does not affect an event caused by any other fax that is queued. i.e both emergency and epidemics use the timer, so both faxes cannot appear at the same time. @@ -1056,6 +1062,13 @@ self.factory_direction = nil self.show_animation = nil end + if old < 254 then + for _, message_info in ipairs(self.message_queue) do + if message_info.drawer_icon == nil then + self:_initMessageWithDrawerIcon(message_info) + end + end + end -- Hotfix to force re-calculation of the money font (see issue #1193) self.money_font = TheApp.gfx:loadFontAndSpriteTable("QData", "Font05V", nil, nil, { apply_ui_scale = true }) self:registerKeyHandlers() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/Lua/room.lua new/CorsixTH-0.70.1/CorsixTH/Lua/room.lua --- old/CorsixTH-0.70.0/CorsixTH/Lua/room.lua 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/Lua/room.lua 2026-08-26 21:56:02.000000000 +0200 @@ -255,7 +255,8 @@ if class.is(humanoid, Staff) and humanoid:fulfillsCriterion(attribute) and not humanoid:isLeaving() and not humanoid.fired and not (humanoid.on_call and humanoid.on_call.object ~= self) and - not humanoid.going_to_staffroom then + not humanoid.going_to_staffroom and + self:isRoomStaffMember(humanoid) then count = count - 1 end end @@ -1125,6 +1126,14 @@ end end +--! Function to check is the humanoid is attached as the serving patients in the room. +--!param humanoid (Humanoid) humanoid to check. +--!return (boolean) Whether the humanoid is attached. +function Room:isRoomStaffMember(humanoid) + -- The ward and operating theatre use staff_member_set. The other rooms use staff_member. + return (humanoid == self.staff_member) or (self.staff_member_set and self.staff_member_set[humanoid]) +end + --! Get the average service quality of the staff members in the room. --!return (float) [0-1] Average staff service quality. function Room:getStaffServiceQuality() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/Src/midi_player.cpp new/CorsixTH-0.70.1/CorsixTH/Src/midi_player.cpp --- old/CorsixTH-0.70.0/CorsixTH/Src/midi_player.cpp 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/Src/midi_player.cpp 2026-08-26 21:56:02.000000000 +0200 @@ -94,6 +94,34 @@ throw std::invalid_argument("Unknown API name"); } +std::string midi_api_to_name(RtMidi::Api api) { + switch (api) { + case RtMidi::LINUX_ALSA: + return {"ALSA"}; + case RtMidi::UNIX_JACK: + return {"JACK"}; + case RtMidi::MACOSX_CORE: + return {"CoreMIDI"}; + case RtMidi::WINDOWS_MM: + return {"Windows MM"}; + case RtMidi::WEB_MIDI_API: + return {"Web MIDI API"}; +#if RTMIDI_VERSION_MAJOR > 5 + case RtMidi::WINDOWS_UWP: + return {"Windows UWP"}; + case RtMidi::ANDROID_AMIDI: + return {"Android AMidi"}; +#endif + case RtMidi::RTMIDI_DUMMY: + case RtMidi::UNSPECIFIED: + case RtMidi::NUM_APIS: + return {""}; + } + + // Silences compiler warnings + return {""}; +} + /** * Return whether the given RtMidi API supports the openVirtualPort method. * @@ -111,6 +139,23 @@ } /** + * Test if the specified API is likely supported by the system runtime. + * + * The test currently attempts to establish a connection to the API to query the + * port count. If that fails, or there is no possible port for the API we + * return false. + */ +bool test_midi_api(RtMidi::Api api) { + try { + RtMidiOut test_midi(api); + return test_midi.getPortCount() > 0; + } catch (const RtMidiError&) { + std::printf("INFO: Cannot query %s", midi_api_to_name(api).c_str()); + return false; + } +} + +/** * Send MIDI events to stop the currently playing audio. * * Sends three channel codes on all MIDI channels: all notes off, all sound off, @@ -318,35 +363,13 @@ std::vector<std::string> apiStrings; for (RtMidi::Api api : apis) { - switch (api) { - case RtMidi::LINUX_ALSA: - apiStrings.emplace_back("ALSA"); - break; - case RtMidi::UNIX_JACK: - apiStrings.emplace_back("JACK"); - break; - case RtMidi::MACOSX_CORE: - apiStrings.emplace_back("CoreMIDI"); - break; - case RtMidi::WINDOWS_MM: - apiStrings.emplace_back("Windows MM"); - break; - case RtMidi::WEB_MIDI_API: - apiStrings.emplace_back("Web MIDI API"); - break; -#if RTMIDI_VERSION_MAJOR > 5 - case RtMidi::WINDOWS_UWP: - apiStrings.emplace_back("Windows UWP"); - break; - case RtMidi::ANDROID_AMIDI: - apiStrings.emplace_back("Android AMidi"); - break; -#endif - case RtMidi::RTMIDI_DUMMY: - case RtMidi::UNSPECIFIED: - case RtMidi::NUM_APIS: - // These should not be selectable - break; + if (api == RtMidi::RTMIDI_DUMMY || api == RtMidi::NUM_APIS || + api == RtMidi::UNSPECIFIED) { + continue; + } + + if (test_midi_api(api)) { + apiStrings.push_back(std::move(midi_api_to_name(api))); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/Src/th_lua_midi.cpp new/CorsixTH-0.70.1/CorsixTH/Src/th_lua_midi.cpp --- old/CorsixTH-0.70.0/CorsixTH/Src/th_lua_midi.cpp 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/Src/th_lua_midi.cpp 2026-08-26 21:56:02.000000000 +0200 @@ -113,67 +113,92 @@ try { luaT_stdnew<th_lua_midi_player>(L, luaT_environindex, true, apiChoice, portChoice, sysexMasterVolume); + return 1; } catch (const std::invalid_argument& e) { return luaL_error(L, "Invalid MIDI API choice: %s", e.what()); + } catch (const std::exception& e) { + return luaL_error(L, e.what()); } - - return 1; } int l_midi_port_list(lua_State* L) { th_lua_midi_player* midiPlayer = luaT_testuserdata<th_lua_midi_player>(L); - const std::vector<std::string> portList = midiPlayer->port_list(); - lua_createtable(L, static_cast<int>(portList.size()), 0); - for (size_t i = 0; i < portList.size(); ++i) { - lua_pushinteger(L, static_cast<lua_Integer>(i) + 1); - lua_pushstring(L, portList[i].c_str()); - lua_settable(L, -3); + try { + const std::vector<std::string> portList = midiPlayer->port_list(); + lua_createtable(L, static_cast<int>(portList.size()), 0); + for (size_t i = 0; i < portList.size(); ++i) { + lua_pushinteger(L, static_cast<lua_Integer>(i) + 1); + lua_pushstring(L, portList[i].c_str()); + lua_settable(L, -3); + } + return 1; + } catch (const std::exception& e) { + return luaL_error(L, e.what()); } - - return 1; } int l_midi_player_play_xmi(lua_State* L) { th_lua_midi_player* midiPlayer = luaT_testuserdata<th_lua_midi_player>(L); + try { + size_t xmiDataLength; + const uint8_t* xmiData = luaT_checkfile(L, 2, &xmiDataLength); - size_t xmiDataLength; - const uint8_t* xmiData = luaT_checkfile(L, 2, &xmiDataLength); - - midiPlayer->play_xmi(xmiData, xmiDataLength); - - return 0; + midiPlayer->play_xmi(xmiData, xmiDataLength); + return 0; + } catch (const std::exception& e) { + return luaL_error(L, e.what()); + } } int l_midi_player_set_volume(lua_State* L) { th_lua_midi_player* midiPlayer = luaT_testuserdata<th_lua_midi_player>(L); - double volume = static_cast<double>(luaL_checknumber(L, 2)); - midiPlayer->set_volume(volume); - return 0; + try { + double volume = static_cast<double>(luaL_checknumber(L, 2)); + midiPlayer->set_volume(volume); + return 0; + } catch (const std::exception& e) { + return luaL_error(L, e.what()); + } } int l_midi_player_stop(lua_State* L) { th_lua_midi_player* midiPlayer = luaT_testuserdata<th_lua_midi_player>(L); - midiPlayer->stop(); - - return 0; + try { + midiPlayer->stop(); + return 0; + } catch (const std::exception& e) { + return luaL_error(L, e.what()); + } } int l_midi_player_pause(lua_State* L) { th_lua_midi_player* midiPlayer = luaT_testuserdata<th_lua_midi_player>(L); - midiPlayer->pause(); - return 0; + try { + midiPlayer->pause(); + return 0; + } catch (const std::exception& e) { + return luaL_error(L, e.what()); + } } int l_midi_player_resume(lua_State* L) { th_lua_midi_player* midiPlayer = luaT_testuserdata<th_lua_midi_player>(L); - midiPlayer->resume(); - return 0; + try { + midiPlayer->resume(); + return 0; + } catch (const std::exception& e) { + return luaL_error(L, e.what()); + } } int l_midi_player_close(lua_State* L) { th_lua_midi_player* midiPlayer = luaT_testuserdata<th_lua_midi_player>(L); - midiPlayer->close(); + try { + midiPlayer->close(); + } catch (const std::exception& e) { + return luaL_error(L, e.what()); + } return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/com.corsixth.corsixth.metainfo.xml new/CorsixTH-0.70.1/CorsixTH/com.corsixth.corsixth.metainfo.xml --- old/CorsixTH-0.70.0/CorsixTH/com.corsixth.corsixth.metainfo.xml 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/com.corsixth.corsixth.metainfo.xml 2026-08-26 21:56:02.000000000 +0200 @@ -20,6 +20,23 @@ </provides> <launchable type="desktop-id">com.corsixth.corsixth.desktop</launchable> <releases> + <release version="0.70.1" date="2026-08-27" type="stable"> + <description> + <p>Bug fixes:</p> + <ul> + <li>Prevent game crashes when using a MIDI API, such as JACK</li> + <li>Prevent game crashes when checking for missing staff in rooms, + such as Psychiatry</li> + <li>Prevented a game crash with the bottom drawer when loading a game + from 0.69.2 or earlier</li> + </ul> + <p>Packager Notes:</p> + <ul> + <li>Fixed a build error on Mac by linking libatomic if atomics are + not built in</li> + </ul> + </description> + </release> <release version="0.70.0" date="2026-07-10" type="stable"> <description> <p>New Features:</p> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/CorsixTH/corsix-th.6 new/CorsixTH-0.70.1/CorsixTH/corsix-th.6 --- old/CorsixTH-0.70.0/CorsixTH/corsix-th.6 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/CorsixTH/corsix-th.6 2026-08-26 21:56:02.000000000 +0200 @@ -95,4 +95,4 @@ CorsixTH is available under the MIT license. .Pp For the full license text see: -.Lk https://raw.githubusercontent.com/CorsixTH/CorsixTH/v0.70.0/LICENSE.txt +.Lk https://raw.githubusercontent.com/CorsixTH/CorsixTH/v0.70.1/LICENSE.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/WindowsInstaller/Win32Script.nsi new/CorsixTH-0.70.1/WindowsInstaller/Win32Script.nsi --- old/CorsixTH-0.70.0/WindowsInstaller/Win32Script.nsi 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/WindowsInstaller/Win32Script.nsi 2026-08-26 21:56:02.000000000 +0200 @@ -24,7 +24,7 @@ ;---------------------------------- Definitions for the game ----------------------------------- !define PRODUCT_NAME "CorsixTH" -!define PRODUCT_VERSION "0.70.0" +!define PRODUCT_VERSION "0.70.1" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CorsixTH-0.70.0/changelog.txt new/CorsixTH-0.70.1/changelog.txt --- old/CorsixTH-0.70.0/changelog.txt 2026-07-05 17:41:49.000000000 +0200 +++ new/CorsixTH-0.70.1/changelog.txt 2026-08-26 21:56:02.000000000 +0200 @@ -1,4 +1,16 @@ ------------------------------------------------------------------------------- +CorsixTH 0.70.1 - Released August 2026 +------------------------------------------------------------------------------- +# Bug Fixes +* Prevent game crashes when using a MIDI API, such as JACK +* Prevent game crashes when checking for missing staff in rooms, such as Psychiatry +* Prevented a game crash with the bottom drawer when loading a game from + 0.69.2 or earlier + +# Packager Notes +* Fixed a build error on Mac by linking libatomic if atomics are not built in + +------------------------------------------------------------------------------- CorsixTH 0.70.0 - Released July 2026 ------------------------------------------------------------------------------- # New Features
