On Tue, Sep 01, 2026 at 10:08:51PM -0400, Brad Smith wrote:
> On Thu, Aug 27, 2026 at 01:19:23AM -0400, Brad Smith wrote:
> > On Mon, Jul 27, 2026 at 01:14:34PM -0700, Thomas Frohwein wrote:
> > > On Sat, 25 Jul 2026 18:24:57 -0400
> > > Brad Smith <[email protected]> wrote:
> > > 
> > > > Within the last few months recoil-rts has gained support for building
> > > > on aarch64. The following diff fixes building the port on aarch64.
> > > 
> > > Thanks, Brad. This is a fairly big port and I'm reluctant to enable it
> > > for arm64 without reports on the test suite (`make test`) and runtime.
> >  
> > I had ran the test suite, ran into some that were failing. I tracked
> > down why one was failing and had the bug fixed upstream. The testClampRad
> > failure upstream is aware of and is undefined beavior for the failing test.
> > The test needs to be fixed.
> > 
> > 
> > 93% tests passed, 2 tests failed out of 29
> > 
> > Total Test time (real) = 108.72 sec
> > 
> > The following tests FAILED:
> >          17 - testCreg (Failed)
> >          25 - testClampRad (Failed)
> > 
> > I can run beyond-all-reason and it downloads assets and the game runs.
> > I can run the Scenarios, the maps download and load. Its just slow as
> > I am running it remotely.
> > 
> > > A convenient way to test runtime (if you don't mind the assets that are
> > > downloaded into ~/.local/state/BAR) is running
> > > 
> > > $ beyond-all-reason
> > > 
> > > and then testing something from "Scenarios" (button on the left). The
> > > first one, "Fortress Assault" would be good one to just load up and give
> > > some commands to the units.
> > > 
> > > Benchmarking can be done in the scenarios at the bottom, "Benchmark
> > > BAR" and "Benchmark pathfinding" will give some times for rendering and
> > > don't require input.
> >  
> > Being this is remote and it is not quick at all.
> > 
> > I am just trying to get the package to build and make sure it works as a
> > start on aarch64; since I noticed upstream added aarch64 support very
> > recently by a team of people working on macOS and Linux support.
>  
> An updated diff.
> 
> I fixed the other 2 issues found by the unit tests.

And last rev. A small tweak to the last fix.


Index: Makefile
===================================================================
RCS file: /cvs/ports/games/recoil-rts/Makefile,v
retrieving revision 1.29
diff -u -p -u -p -r1.29 Makefile
--- Makefile    13 Aug 2026 13:53:11 -0000      1.29
+++ Makefile    2 Sep 2026 20:52:26 -0000
@@ -9,6 +9,7 @@ COMMENT =               real-time strategy game engin
 
 V =                    2026.07.04
 PKGNAME =              recoil-rts-${V}
+REVISION =             0
 
 DIST_TUPLE +=          github beyond-all-reason RecoilEngine ${V} .
 DIST_TUPLE +=          github mikke89 RmlUi \
Index: patches/patch-rts_Sim_Objects_SolidObject_cpp
===================================================================
RCS file: patches/patch-rts_Sim_Objects_SolidObject_cpp
diff -N patches/patch-rts_Sim_Objects_SolidObject_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-rts_Sim_Objects_SolidObject_cpp       2 Sep 2026 20:52:26 
-0000
@@ -0,0 +1,15 @@
+- fix a failing creg unit test
+  4ab6518dc3469dd143305927071828acc85a3c58
+
+Index: rts/Sim/Objects/SolidObject.cpp
+--- rts/Sim/Objects/SolidObject.cpp.orig
++++ rts/Sim/Objects/SolidObject.cpp
+@@ -51,6 +51,8 @@ CR_REG_METADATA(CSolidObject,
+       CR_MEMBER(team),
+       CR_MEMBER(allyteam),
+ 
++      CR_MEMBER_UN(paletteIndex),
++
+       CR_MEMBER(creationFrame),
+ 
+       CR_MEMBER(pieceHitFrames),
Index: patches/patch-rts_System_creg_SerializeLuaState_cpp
===================================================================
RCS file: patches/patch-rts_System_creg_SerializeLuaState_cpp
diff -N patches/patch-rts_System_creg_SerializeLuaState_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-rts_System_creg_SerializeLuaState_cpp 2 Sep 2026 20:52:26 
-0000
@@ -0,0 +1,15 @@
+- fix a unit test failing on OpenBSD/aarch64
+  fa50380be027b66f702efb4bc5a37b1d2c35f4f2
+
+Index: rts/System/creg/SerializeLuaState.cpp
+--- rts/System/creg/SerializeLuaState.cpp.orig
++++ rts/System/creg/SerializeLuaState.cpp
+@@ -1042,7 +1042,7 @@ void creg_lua_State::PostLoad()
+       }
+ 
+       size_t savedpc_offset = * (size_t *) &savedpc;
+-      savedpc = GetProtoFromCallInfo(ci)->code + savedpc_offset;
++      savedpc = GetProtoFromCallInfo(ci - 1)->code + savedpc_offset;
+ }
+ 
+ 
Index: patches/patch-test_engine_System_testClampRad_cpp
===================================================================
RCS file: patches/patch-test_engine_System_testClampRad_cpp
diff -N patches/patch-test_engine_System_testClampRad_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-test_engine_System_testClampRad_cpp   2 Sep 2026 20:52:26 
-0000
@@ -0,0 +1,41 @@
+- tests: fix undefined float-to-short conversion in testClampRad
+  c1dea15fa0f1c1beb593133fc4061f9c684f6a15
+
+Index: test/engine/System/testClampRad.cpp
+--- test/engine/System/testClampRad.cpp.orig
++++ test/engine/System/testClampRad.cpp
+@@ -8,6 +8,19 @@
+ 
+ #include <catch_amalgamated.hpp>
+ 
++// COB scripts encode angles as TA units where a full turn is COBSCALE 
(65536),
++// so any angle past a half turn exceeds the range of a signed short and is 
meant
++// to wrap around (it is a circular 16-bit angle). Truncating the scaled 
value to
++// int first is well defined for the bounded angles the sim feeds in, and the
++// following int->short narrowing performs that modular wrap 
deterministically.
++// Converting straight from float to short would be undefined behaviour once 
the
++// value leaves short's range, and produced different results on arm64 vs x86,
++// desyncing multiplayer.
++static inline short RadAngleToCobShort(float radAngle)
++{
++      return static_cast<short>(static_cast<int>(radAngle * RAD2TAANG));
++}
++
+ InitSpringTime ist;
+ 
+ TEST_CASE("ClampRad")
+@@ -43,10 +56,10 @@ TEST_CASE("ClampRad")
+       CHECK_FALSE(std::signbit(ClampRad(0.0f)));
+ 
+       // Test TAANG2RAD conversion to short for [0, 2pi)
+-      CHECK(static_cast<short>(ClampRad(0.0f) * RAD2TAANG) == short(0));
+-      CHECK(static_cast<short>(ClampRad(+std::nextafterf(math::TWOPI, 
-std::numeric_limits<float>::infinity())) * RAD2TAANG) == short(-1));
+-      CHECK(static_cast<short>(ClampRad(+std::nextafterf(       0.0f, 
+std::numeric_limits<float>::infinity())) * RAD2TAANG) == short( 0));
+-      CHECK(static_cast<short>(ClampRad(+std::nextafterf(TAANG2RAD  , 
+std::numeric_limits<float>::infinity())) * RAD2TAANG) == short(+1));
++      CHECK(RadAngleToCobShort(ClampRad(0.0f)) == short(0));
++      CHECK(RadAngleToCobShort(ClampRad(+std::nextafterf(math::TWOPI, 
-std::numeric_limits<float>::infinity()))) == short(-1));
++      CHECK(RadAngleToCobShort(ClampRad(+std::nextafterf(       0.0f, 
+std::numeric_limits<float>::infinity()))) == short( 0));
++      CHECK(RadAngleToCobShort(ClampRad(+std::nextafterf(TAANG2RAD  , 
+std::numeric_limits<float>::infinity()))) == short(+1));
+ }
+ 
+ TEST_CASE("ClampRadPi")

Reply via email to