Played (closed) Alpha with my inspired . I’m simply in awe that I can replay missions from (or ) with more modern graphics and modern interface devices again. I spent _so many_ hours playing these games as a kid.

This is the heavily cut VOD of the live stream over at @bekopharm@live.famkos.net (pick your poison):

https://makertube.net/w/r1LRrqDWnhw4wRk92uNfzo /
https://www.youtube.com/watch?v=9T2jxqT_5sU

This time I play with the native Linux version and my X52 Pro joystick (which means I actually have a chance of hitting stuff too). The following missions were played:

Historical Mission 2 / Wingmen Are Important
Historical Mission 3 / Sattelites Near Coruscant
Historical Mission 4 / Beating The Odds
OP 1: Destroy Imperial Convoy (Uncut)
OP 2: Reconnaissance Mission (Uncut)
OP 3: Fly Point During Evacuation (Uncut)
OP 4: Protect Medical Frigate (Uncut)

XWVM is not an official product from Lucasfilm Ltd. or Disney. It is not endorsed or authorized by either. It is a fan recreation of the game engine used to play X-Wing and TIE Fighter for the sake of accessibility and requires the original game assets to work.

Kudos to the XWVM team, they are doing a stellar job here.

The dedicated project website for the Macross inspired SimPit is https://simpit.dev

I gave in and changed my event forwarding method in node-red for the Elite Dangerous Journal. This file is updated on various in-game events but in a way that makes it difficult to get new events only since last update. Another problem is that it’s not really a valid JSON file because it has one JSON per line but it’s not a valid JSON array. This is why it has to be parsed line by line and mashed together by event type (name) again to get the latest data for each event type per dump. Each event has it’s own timestamp by set by the game. The latest timestamp is now saved on the special flow const so node-red keeps the value in the “global” memory of the current flow:

msg.payload.event = "Journal";

let newJournalTimestamp = flow.lastJournalTimestamp;

Object.keys(msg.payload).forEach((key) => {
  if (msg.payload[key].timestamp) {
    const keyTimestamp = new Date(msg.payload[key].timestamp).getTime();

    if (!flow.lastJournalTimestamp || flow.lastJournalTimestamp < keyTimestamp) {
      // this entry is new - keep it. MULTIPLE events may have the
      //  same timestamp so wait with reassigning so we don't skip
      //  em or get the latest a 2nd time if nothing else changes.

      // update the next latest timestamp if this is newer
      if(!newJournalTimestamp || newJournalTimestamp < keyTimestamp) {
        newJournalTimestamp = keyTimestamp;
      }
    } else {
      // lastJournalTimestamp is newer, skip this
      msg.payload[key] = null;
    }
  }
});

// make sure this is a valid date for the next time
flow.lastJournalTimestamp = newJournalTimestamp || new Date().getTime();

// remove all nulled events from the payload
msg.payload = Object.fromEntries(
  Object.entries(msg.payload).filter(([_, p]) => p !== null)
);

msg.payload.timestamp = new Date(flow.lastJournalTimestamp);

return { payload: msg.payload };

So I do now keep track of the last read timestamp and reject every event that is older than the last read keeping the Journal dump smaller. This way I don’t have to try to keep track of the “latest” event to drag data from. Refuelling e.g. can happen from whopping 4 (or more) different events and it’s painful to compare all and check which one is the latest to keep track of the real current fuel levels for each tank.

Downside is I won’t get a full set of data for the current session any more if I have to reload my HUD app. This could be mitigated by using MQTT though where I could simply persist each event topic. That is already implemented and I can choose between SocketIO or MQTT in my app anyway.

This uses my X4-SimPit extension for X4: Foundations, that sends ship telemetry via a socket to my node-red plumbing pipeline, which in turn forwards data to Websockets, SocketIO and MQTT. Various subscriber listen on the new messages to run blinken lights and my HUD app. I’m using the well known message format also used by Elite Dangerous so it’s compatible with that game as well.

Pick your poison: https://makertube.net/w/nUoG2ZPeAW1QhT3A2BXRrM / https://www.youtube.com/watch?v=wp1PkVhH9cc

Oh yeah… and on Linux PC 🤓

Let me know what you think!

X4-SimPit code (pending changes) is here: https://github.com/bekopharm/x4-simpit
The cockpit panel has a dedicated project page here: https://simpit.dev/

Played (closed) Alpha with my ViperPit and with glasses. I’m simply in awe that I can replay missions from (or ) with more modern graphics and modern interface devices again. I spent _so many_ hours playing this as a kid.

This is the heavily cut VOD of the live stream over at https://live.famkos.net (pick your poison):

https://makertube.net/w/hW6cJeqBY42YoryJL1gRg5 /
https://www.youtube.com/watch?v=8at4P5rf-gE

I go over the input settings and show it’s capabilities to connected various joystick devices, demo the Proofing Grounds and showcase mission 1+2. In the end I go over various settings for the XWVM engine and how the machine hardly sweats displaying the gorgeous cockpit.

XWVM is not an official product from Lucasfilm Ltd. or Disney. It is not endorsed or authorized by either. It is a fan recreation of the game engine used to play X-Wing and TIE Fighter for the sake of accessibility and requires the original game assets to work.

The game was played with Pro XR running in Side-By-Side mode thanks to ReShade on a Linux PC.

Kudos to the XWVM team, they are doing a stellar job here.

Gna gna. Found out why my Ace Combat started to crash. The culprit is dwmapi.dll, which is needed for the UE4SS mod (Cheat Engine), so I can adjust the FOV – because the devs kinda “forgot” to add a gorram FOV slider to the game that I NEED and absolutely REQUIRE.

Turns out something in there results in an Access Violation on Start with Proton Experimental (and 9). It works fine with Proton 8. I do not remember switching that but that was the solution in the end 😩

This is after I carefully tried lots of stuff like resetting savegame, disable and remove other mods, fiddle with ini files, read miles of debug logs and whatnot.

Remember my proof concept to read IMU data of my glasses to ?

hodasemi wrote a connector based on the idea that works without : https://github.com/hodasemi/xr_to_opentrack_rs – comes with a systemd service file so it can run in the background.

Once installed the only step left to do is fire up OpenTrack 🤘😄🤘

So I was asked if my head tracking approach of reading the IMU data from my Viture Pro to OpenTrack and SBS (side-by-side) mode with ReShade would also work with StarCitizen.

Guess it does 🤷

Pick your poison to watch the video: https://www.youtube.com/watch?v=rWUC2Y3TRh4 / https://makertube.net/w/8L7gVN8NnLvjhQCPGNmd6W

I start Star Citizen via Lutris (and not with Steam), which requires slightly different settings once ReShade is installed:

Enable Gamescope: ON
Output Resolution: "3840x1080"
Game Resolution: "3840x2160" (set this also ingame!)
Custom Settings: "--scaler stretch"

Can this get you banned? Who knows 🤷 Jury is still out on this. Do I care? Nope. I won’t miss my puny starter pack.

YMMV.

The proof of concept code to read the IMU data can be found at https://github.com/bekopharm/xr_to_opentrack (pending changes).

It works with the Breezy GNOME xr_driver: https://github.com/wheaney/breezy-desktop (but the Vulkan one works probably too but that’s untested). It should also be compatible with other glasses that have IMU for Breezy available.

There is an unlisted SBS version of this video linked in the description. You will need XR glasses that do FULL SBS though to watch it!

Until now I used OpenTrack with my DIY IR tracker or the Neuralnet tracker. I knew that my XR glasses feature IMU data though and the xr_driver of the Breezy Desktop project allows to access the data via IPC on Linux PC. So I did what Linux user do: I wrote a script to access the IMU data and forwarded it via UDP to OpenTrack:

Pick your poison to watch the video: https://www.youtube.com/watch?v=njuumLUvqrM / https://makertube.net/w/2bNyxJhdyydTeFq17onikv

This reminded me that I also wrote a proof of concept to implement the FaceTrackNoIR (or OpenTrack) protocol into FreeSpace 2 Open on Linux PC ( https://makertube.net/w/7VtfAjW7EiAUS5aiPwG7if ) so I gave it a spin to test the data bridge. That was smooth sailing!

The mod is Diaspora: Shattered Armistice, still awesome today: http://diaspora.hard-light.net/ (Warning: This may fuel a desire to re-watch the BSG series again 😀).

The bridge code can be found at https://github.com/bekopharm/xr_to_opentrack (pending changes).

It works with the Breezy GNOME xr_driver: https://github.com/wheaney/breezy-desktop (but the Vulkan one works probably too but that’s untested). It should also be compatible with other glasses that have IMU for Breezy available.

Update: hodasemi wrote a Rust connector based on the idea that works without Breezy: https://github.com/hodasemi/xr_to_opentrack_rs – comes with a systemd service file so it can run in the background. Once installed the only step left to do is fire up OpenTrack 🤘

I know most of you won’t care or see why this is of interest but I got another game, this time No Man’s Sky, working in (side-by-side) mode using [on Linux PC] 🤓

https://www.youtube.com/watch?v=_VGv_h097mI

Steam start parameters are a little bit different though, once ReShade was configured for Vulkan:

WINEDLLOVERRIDES="d3dcompiler_47=n;vulkan=n,b;vulkan-1=n,b"  gamescope -h 2160 -w 3840 -H 1080 -W 3840 --scaler stretch -f -e -- %command%

Apparently there is an open bug for ReShade and Vulkan via Proton but frankly I didn’t quite get the details – it just worked for me: https://github.com/kevinlekiller/reshade-steam-proton/issues/6 – YMMV.

As usual: Viture or XReal users can probably just press fullscreen after switching into SBS mode to watch this. Others may need an external player to sort it out – I sure love delivering to the absolute niche of the niche [of yet another niche] 🤷

I know most of you won’t care or see why this is of interest but I got another game, that I like a lot, working in (side-by-side) mode yesterday using [on Linux PC] 🤓

https://www.youtube.com/watch?v=tWnFRPkomzQ

Steam start parameters are a little bit different though, once ReShade was configured for DirectX11:

WINEDLLOVERRIDES="d3dcompiler_47=n;d3d11=n,b" gamescope -h 1080 -w 1920 -H 1080 -W 3840 --scaler stretch -f -e -- %command%

I’m considering to start an extra channel for the SBS stuff since this probably just annoys most people. In fact downvotes started to pile up but is it my fault that YT (or PeerTube for that matter) doesn’t support this in any sane way? I know about frame packed versions now but that only results in badly automated out of focus Anaglyph 3D videos nobody can enjoy.