diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b59e591..f65ba48b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,15 @@
All notable changes to Chromatics are documented here.
+## 4.3.33
+
+- Fixed lighting stopping for the rest of the session when the Screen Capture base layer was in use and you returned to the title or character select screen.
+- Yeelight, LIFX, Nanoleaf, and Alienware lights that are switched off or off the network at startup now log as device notices instead of errors.
+
+## 4.3.32
+
+- Improved the accuracy and speed of game-data reads on FFXIV patch 7.55, including inventory, chat log, job gauges, and player stats.
+
## 4.3.31
- Added support for FFXIV patch 7.55.
diff --git a/Chromatics.Tests/Chromatics.Tests.csproj b/Chromatics.Tests/Chromatics.Tests.csproj
index 53d68223..b71a0e18 100644
--- a/Chromatics.Tests/Chromatics.Tests.csproj
+++ b/Chromatics.Tests/Chromatics.Tests.csproj
@@ -38,7 +38,7 @@
-
+
diff --git a/Chromatics.Tests/Core/ScreenCaptureProcessorLifetimeTests.cs b/Chromatics.Tests/Core/ScreenCaptureProcessorLifetimeTests.cs
new file mode 100644
index 00000000..891ebb6d
--- /dev/null
+++ b/Chromatics.Tests/Core/ScreenCaptureProcessorLifetimeTests.cs
@@ -0,0 +1,21 @@
+using Chromatics.Layers;
+
+namespace Chromatics.Tests.Core;
+
+public class ScreenCaptureProcessorLifetimeTests
+{
+ [Fact]
+ public void Instance_IsRebuiltAfterDispose()
+ {
+ // DisposeAll runs every time the player returns to the title screen and
+ // nulls the processor's surface. Handing the disposed object back out
+ // left the Screen Capture base layer attaching to a dead surface on
+ // every later tick, which killed lighting for the rest of the session.
+ var first = ScreenCaptureProcessor.Instance;
+ first.Dispose();
+
+ var second = ScreenCaptureProcessor.Instance;
+
+ Assert.NotSame(first, second);
+ }
+}
diff --git a/Chromatics.Tests/Helpers/NetworkFailureHelperTests.cs b/Chromatics.Tests/Helpers/NetworkFailureHelperTests.cs
new file mode 100644
index 00000000..29ca8910
--- /dev/null
+++ b/Chromatics.Tests/Helpers/NetworkFailureHelperTests.cs
@@ -0,0 +1,53 @@
+using System;
+using System.IO;
+using System.Net.Http;
+using System.Net.Sockets;
+using Chromatics.Helpers;
+
+namespace Chromatics.Tests.Helpers;
+
+public class NetworkFailureHelperTests
+{
+ [Fact]
+ public void ConnectionRefused_IsUnreachable()
+ {
+ var ex = new SocketException((int)SocketError.ConnectionRefused);
+
+ Assert.True(NetworkFailureHelper.IsUnreachable(ex));
+ }
+
+ [Fact]
+ public void SocketFailureWrappedInIoException_IsUnreachable()
+ {
+ var ex = new IOException("write failed", new SocketException((int)SocketError.HostUnreachable));
+
+ Assert.True(NetworkFailureHelper.IsUnreachable(ex));
+ }
+
+ [Fact]
+ public void HttpAndTimeoutFailures_AreUnreachable()
+ {
+ Assert.True(NetworkFailureHelper.IsUnreachable(new HttpRequestException("no route")));
+ Assert.True(NetworkFailureHelper.IsUnreachable(new TimeoutException()));
+ Assert.True(NetworkFailureHelper.IsUnreachable(new TaskCanceledException()));
+ }
+
+ [Fact]
+ public void SocketFailureInsideAggregate_IsUnreachable()
+ {
+ var ex = new AggregateException(
+ new InvalidOperationException("unrelated"),
+ new SocketException((int)SocketError.TimedOut));
+
+ Assert.True(NetworkFailureHelper.IsUnreachable(ex));
+ }
+
+ [Fact]
+ public void ApplicationBugs_AreNotUnreachable()
+ {
+ Assert.False(NetworkFailureHelper.IsUnreachable(new NullReferenceException()));
+ Assert.False(NetworkFailureHelper.IsUnreachable(new InvalidOperationException()));
+ Assert.False(NetworkFailureHelper.IsUnreachable(
+ new InvalidOperationException("outer", new ArgumentOutOfRangeException())));
+ }
+}
diff --git a/Chromatics.Tests/Helpers/UpdateNotesTests.cs b/Chromatics.Tests/Helpers/UpdateNotesTests.cs
index f370b39b..c44e8290 100644
--- a/Chromatics.Tests/Helpers/UpdateNotesTests.cs
+++ b/Chromatics.Tests/Helpers/UpdateNotesTests.cs
@@ -57,7 +57,7 @@ public void EmptyOrWhitespaceNotes_ReturnEmpty()
{
Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection("", "4.3.26"));
Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection(" ", "4.3.26"));
- Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection(null, "4.3.26"));
+ Assert.Equal(string.Empty, UpdateService.TrimNotesToOwnSection(null!, "4.3.26"));
}
[Fact]
diff --git a/Chromatics/Chromatics.csproj b/Chromatics/Chromatics.csproj
index 7e22007b..1696a443 100644
--- a/Chromatics/Chromatics.csproj
+++ b/Chromatics/Chromatics.csproj
@@ -10,7 +10,7 @@
net10.0-windows10.0.19041.0
10.0.17763.0
Chromatics.Program
- 4.3.31.0
+ 4.3.33.0
Danielle Thompson