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

Reply via email to