If you want to get a feel for what Sojour is capable of, the current manual can be viewed here.
Have Fun!
RobP

If you want to get a feel for what Sojour is capable of, the current manual can be viewed here.
Have Fun!
RobP
RPG Frequencies has taken the time to create a Discord Channel for Sojour to promote discussion!
You can join the discord here: https://discord.gg/DRnv3Qs5Ru
I’d like to thank him for the time and effort in setting this up!
RPG Frequencies also hosts a You-Tube channel covering all things Solo RPG here:
https://www.youtube.com/@RPGFrequencies
In the meantime,
Have Fun!
RobP
Sojour is a Windows based solo focused VTT that provides journals, maps, tokens and time management. A detailed run through is shown on this timestamped video.
It costs $10 USD. Once bought, Sojour is yours to keep. There are no subscription fees, online servers or DRM. All your data remains your data, stored on your computer. You will get free updates as they are produced.
If you have ever struggled trying to use a multiplayer VTT for solo gameplay, then you should give Sojour a look 🙂


What are Cascading Shadow Maps (CSM) and what does it achieve?
Shadow map based systems create a depth texture representing the scene depth from a light source’s point of view. This depth texture is then sampled across a whole scene from the camera’s point of view to work out what’s in shadow and what isn’t.
The issue with shadow maps is that the greater the range of depth that you are dealing with, the more the depth texture has to be stretched in terms of its depth to cover all possible values. ie you are trying to squeeze larger ranges of depth information into the fixed number values that a single pixel can hold. This can then lead to sub-par shadows.
You’ve probably seen these low resolution shadows in some commercial games where the shadows have jagged triangular looking edges.
Dorian’s CSM system gets around this by creating multiple depth textures that are range dependent. These are called cascades. Each cascade is responsible for creating shadows over a specific depth range.
Having multiple depth textures in cascades reduces how much each one is stretched out to fill the scene depth. What’s more, these cascades are tuned so that the nearer cascades have smaller overall depth ranges (less stretching). This results in pin sharp shadows!
Medium to long distance cascades have larger depth ranges which results in fuzzier shadows, but in these cases the objects are far enough away that a player won’t notice.
The overall impression that the player gets is one of pin sharp shadows!
The image at the top of this post shows the effect of ramping up the cascades – Dorian supports differing numbers of cascade on a per light source basis.
The one cascade image on the left is what a typical shadow mapped engine looks like. The shadows don’t look too bad in that example, but the bigger the world, the worse it gets – and the demo world above is very small.
Note that as I add more cascades, the shadow quality improves ![]()
I’m happy with the shadows system but I still have a lot more work to do and this work should be done now whilst the iron is hot.
Why?
I tend to forget hard won knowledge unless I continually work at it. I had the same issue with Ionian – the previous graphics engine. That graphics engine lasted over twenty years – but it was so reliable that I rarely had to look at its code, which resulted in my graphical knowledge draining away.
It’s the driving reason why Dorian’s capabilities will be taken to a much higher level than Sojour needs, as the expectation is that once it’s done, I’ll rarely touch the actual code again – which means lost knowledge. Hence my determination to strike whilst the iron is hot!
That said, Ionian which is currently used in Sojour is no slouch. It can do real-time shadows – using shadow volumes, real time reflections, skyboxes and bill-boarding:


I will need to get Dorian to a point where it can do everything that Ionian can do at the very minimum. Though my plans are for a lot more!
Please have patience!
Have Fun!
RobP
There’s going to be quite a few of these – sorry!
Working on a graphics engine seems like a diversion but it is critical for Sojour as the latest Visual Studio will not build 32 bit apps. Alas, Sojour’s current graphics engine, Ionian, is 32 bit only – hence the re-write.
On the plus side, Dorian is way more powerful 🙂
The ECS system in Dorian makes all the animations and camera movements completely trivial. It really is a joy to work with!
This is a video of the first version of it’s shadow system. It has one more iteration which is to make it use Cascading Shadow Maps then we are done with shadows and can then work on the next features!
Have fun!
RobP
Most of my focus is to get Sojour ported to 64 bit and running on a .net 10 platform.
If I pull this off, you get extra performance and I will get access to additional tools that will allow me to do things with Sojour that I have always wanted to do!
The big hold up has been Ionian, Sojour’s custom graphics engine. I wrote it a long time ago for another project of mine called Ancient Armies. It’s not a bad engine, but it is 32 bit and it can only render to one window at a time.
A few posts back I showed off some of my work with Dorian – Ionian’s replacement.
What was probably not made too clear, is that it was a POC:
What’s a POC?
A POC is a Proof Of Concept. The idea being that for complex tasks – like a graphics engine – you knock up a quick and dirty system purely as a learning exercise. That way when you work on the real thing, you will have a lot more relevant experience under your belt.
The key point of a POC is that you learn what you need to learn, de-risk what needs de-risking and then you effectively throw it away. The lessons learned are then applied to creation of the full enterprise system.
For the last month or so I have been doing just this – working on the real Dorian Engine and not the POC.
The actual engine is way more powerful, expressive and scalable when compared to the POC. It doesn’t look as good – at least not yet – simply because it is at an earlier point in its life cycle.
The biggest difference between Dorian and the POC is that Dorian uses an enterprise grade architecture known as ECS (Entities, Components & Systems).
I think it would be fair to say that ECS takes a bit of getting used to. However, it is massively scalable, simple to use and expressive in ways that are only limited by your own imagination.
I should probably warn you that the next section of this post is going to take the geek factor up to 100! Those of a nervous disposition might well want to bail out about now 😊 (I need to go technical in order to show you the main highlights of Dorian’s ECS system.)
Dorian is now at a point where its architecture is all in place – all I need to do is keep adding features to it – which the new architecture makes exceedingly easy to do.
Here is a short video of me testing three different cameras all pointed at the same world using Dorian. Each window is showing exactly the same thing but from three different perspectives.
What the video shows are three dynamically resizable windows (Ionian in Sojour can only render to a single window) where each window is pointed at the same world. Dorian allows a lot of flexibility here. You could for example have a few windows rendering world number 1 and another few rendering world number 2 and so forth.
The left hand pane in the video shows the cubes’ actual movement because the camera is not moving. The ones on the right show things from the perspective of the treasure chest cube – one is a follow camera, the other is a first person camera.
In a standard engine like Ionian, coding the animation of all the cubes and the advanced camera behaviours such as the chase camera would have been quite difficult. But, with Dorian’s ECS system it is almost trivial.
What is ECS precisely?
It’s a system where you have Entities and that these entities can represent anything – cameras, models, sound, AI, animations, environments – absolutely anything you can think of.
The key concept of ECS is that they are all treated the same.
The way it works is that the entities are just an Id and that’s it!
Id’s alone don’t do much. However, ECS allows you to dynamically attach (or detach) Components to any entity and these components contain just data. The idea being that if your entity needs to store some specific data, you just attach the appropriate component to it that can store that specific data.
Ok, so you now have entities with data. How is that useful?
Well, the next thing you can do is attach or detach behavioural tags to an entity. Systems within Dorian look out for these tags and operate on the entities that have them using the data stored in the attached components. (I told you we were getting technical!)
This makes the engine very simple to use and incredibly expressive. If you want something to behave in a certain way, just attach the appropriate tag! And that’s it. Very, very simple, but very very powerful.
I don’t normally show my code because it is closed source, but I will make an exception here so that you can see how clean and easy Dorian is to work with – please bear in mind these are very early days!
First up initialisation:
Dorian is incredibly flexible. Rather than offering a fixed rendering pipeline, it allows the caller to precisely define their own rendering pipeline and they can create as many as they need – though in this example I use the same pipeline for all three windows.
This means that developers can precisely pick what they need to go into their pipeline and they can precisely order it how they want. They can even add their own custom pipeline systems – they are not constrained by what Dorian provides.
It’s flexible in that if I wanted reflections for instance, I could just dynamically add a ReflectionsCubeMapRenderPass and the whole thing would just work!
The other thing Dorian provides that neither Ionian nor the POC offer are simulation (not shown) and animation pipelines. Both of these run independently of the rendering pipelines and are just as configurable:
The code above sets up an animation pipeline precisely the way I want it.
One of the features I added to it is the ability to process ‘Follow’ behaviour – that is to have one entity follow another. I do this by adding a FollowTarget system to the animation pipeline.
This system will be querying Dorian’s ECS system for the relevant entities and then it will act upon them.
For camera 2, we use the FollowTarget system by attaching a ‘Follow’ component to the camera. I have attached this component to the camera as I want the camera to obtain the additional parameters it needs to allow it to follow another entity (the camera itself is an entity)
Finally, the last line adds a behavioural tag to the camera which invokes the follow system for this camera.
That’s it! That’s all the coder has to do to make any entity in Dorian follow any other entity, no matter how complex the movements. It makes the system incredibly easy to use.
If you want the camera to stop following, just remove the tag. You could even change what it’s following and do all of this dynamically.
The beauty of the system is that each entity can have as many behaviours as you want and that these behaviours can be dynamically attached or detached whenever you want and that the same behaviours can be applied to any entity.
For example, you could pretty much use the same code to make one model follow another…
Here is another example of Dorian’s ECS system in action:
Here we have another entity, this time the cube you see floating in the demo with the big smiley face.
Once more, we attach a data component to give the entity (the smiley cube) the additional parameters it needs to support animations.
Next, we tag it with the IsAnimatedSinsoidally tag to make it rotate and move. That is all I need to do!
If I want the cube to stop moving I remove the tag.
To top it off, that particular animation is a custom one that I added as a developer using Dorian (as opposed to being the developer coding Dorian).
Dorian allows you to add custom Systems, Tags and Components, so you are not limited by what Dorian can do out of the box.
Dorian is an entity based system, so I could just as easily tag a camera with the same tag as above and have the camera automatically move around like the cube! No additional code required.
It’s this feature that makes Dorian so expressive and so powerful.
Finally, one more code example, but this time it is a structural connection:
Dorian allows you to connect (or disconnect) any entity to any other entity! Here it happens to be a camera to a cube model, but that’s just a coincidence.
I could have, for example, connected one of the cubes to another cube! (everything in Dorian is an entity) If that other cube was the parent, the cube we just connected would automatically move along with it. That is the expressive power of Dorian.
Dorian also features its own querying system to allow a developer to easily get at any type of entity that they want.
For example, maybe they want Dorian to return all entities with a Follow component, marked with an IsFollowing behavioural flag and that is in possession of the matrices and vectors to position it in space. This is all you would need to do:

It is an odd architecture to work with until you get used to it.
For example in Ionian and in the POC you had an actual camera class, whereas Dorian doesn’t have cameras. It just has entities that happen to have a camera tag and a world transform component attached to it and that’s it. Together this dynamic composition makes a camera – along with the associated system to operate on its data.
I know this post won’t make a lot sense to most people, but hopefully it gets across two things:
Firstly, I’m still hard at work!
And secondly, that what I’m creating – Dorian – is something of an architectural marvel. It will be the jewel in Sojour’s crown.
Dorian will allow Sojour to have multiple map panes open and visible at the same time. You could even use it to send a ‘players’ map to another monitor when using Sojour as a GM assistant.
The possibilities are endless!
That’s enough from me.
Have Fun!
RobP
I’m still working on Dorian the new graphics engine for Sojour.
The proof of concept shown a post or two ago has now been retired and the actual coding of the engine itself has commenced. It is pretty powerful, a lot more powerful than the proof of concept, so I’m expecting great things of it.
The downside is that code wise it is a lot larger and more complex than the Ionian graphics engine that Sojour currently uses:
What’s changed this release?
The screenshot sub-system. 😊
I had a number of customer reports that the old system used to crash on multi-monitor setups.
As a result I bought myself a third monitor. This finally let me reproduce some of the issues my customers were seeing.
After investigating the core issues, I decided to rewrite the entire screenshot system from scratch.
It now works properly in multi-monitor, multi-DPI setups and is much less prone to out of memory issues. In fact I didn’t see single one at all during the extensive testing and this was on a low powered laptop driving three screens!
I’m pretty happy with the newer system. However, there are some behavioural changes when compared to the previous system.
Firstly, to take the screenshot, you now click and hold the left mouse button and then drag the mouse cursor to size the rectangle. When happy, let go of the mouse and you have your screenshot. This seems to be the industry standard, hence the change.
The new system also allows you to use the <ESC> key to exit screen shot mode if you wish to exit without taking a screenshot.
The final change is that it now darkens the whole screen except the area being screenshotted:
This dimming of the screen makes it much more obvious that you are in screenshot mode and it makes the selected area stand out a lot more.
That’s it for this release.
Have Fun!
RobP
Don’t worry about the version number – you aren’t missing v1.6.3.0 – not all of my build system’s releases go public 🙂
This release contains a single fix, albeit one that took a fair bit of effort to resolve.
Mouse trackpads and touchscreens should now work with Sojour’s map zoom functionality.
The map zoom system has been completely overhauled and has been tested using a variety of trackpad/touchscreen gestures and now seems to behave itself properly. (In the past it would go to max zoom and then fight the keyboard and mouse wheel zoom controls)
That said, there are a huge variety of trackpads and touchscreens out there. I would be very interested to hear from anyone still experiencing map zoom issues with their devices after this fix.
EDIT: Just had independent confirmation that this is fixed 🙂
That’s it for this release.
Have Fun!
RobP
This is a tiny release that now re-enables the left and right cursor keys in the journals. The caveat being that the journal must be in focus and the mouse cannot be over the map pane.
These keys used to be disabled due to the fact that they used to accidently trigger inopportune tab changes.
That’s it for this update – I said it was tiny!
As for the future, I will be posting a video relatively soon that will describe where Sojour is and where I want to take it. I will also be talking about the engineering challenges that I will need to overcome to give you folk the best possible solo journaling system.
Prior to that future update, what I can talk about, is one of the most critical challenges that I currently face: Sojour’s 32 bit graphics engine called Ionian.
Ionian’s biggest issue is that it can only be 32 bit, but Microsoft’s latest development tools only allow for 64 bit development – as a result I have to write a brand new graphics engine – in this case it is called Dorian .

Dorian has many advantages over Ionian.
It’s 64 bit which will enable me to get the rest of Sojour onto much more modern development platforms. Dorian is also User Interface agnostic – Ionian only used to work with WinForms – Dorian works with anything Windows based.
The final bonus is that Dorian can simultaneously render to as many windows as you need (as seen in the screenshot) – Ionian by contrast, can only render to a single window. It’s one of the reasons why you can only see one map at a time in Sojour.
Once Dorian is integrated into Sojour, we will have the ability to display multiple maps simultaneously, including sending ‘player-focused’ maps to another monitor for customers using Sojour as a GM aid.
I won’t say much more, suffice to say that writing a custom graphics engine takes time, plus there are many other technologies that we need to talk about.
I will talk about these in the near future – we just need a little patience!
Also, for those that don’t know, once you pay for Sojour, all new updates are free – including this technology upgrade when it is done.
In the mean time…
Have Fun!
RobP
This version contains a few fixes and enhancements centred around window positioning – if you pardon the pun.
First up, opened documents, document templates or external resources can now be centred on the primary monitor by right clicking on them in the tree-view and selecting this new option:
I have also fixed the early disk status dialog windows so that they are now centred correctly during Sojour’s load cycle.
The Webview2 component used for the PDFs also got upgraded to the latest version.
Finally, Sojour should now remember window positions correctly for setups with more than two monitors**.
** I only have access to two monitors to test against, so I’m coding this fix ‘blind’. It will be interesting to get feedback from customers using such environments!
That’s it for this release!
Have Fun!
RobP
This release is primarily about making Sojour play nicely with Cloud Drives.
It’s one of those releases where a huge amount of work has gone into it, but if I have done my job correctly, you won’t notice much of a difference between this version and the previous one.
I won’t go into too much detail as to how the new filing system works – that’s the video’s job which you can view at the end of this post.
What I will say is that this is the first iteration of this new and complex filing system. It has had around 2 weeks of testing, but alas, the hardware and cloud systems that I have access to is somewhat limited, which might impact the efficacy of the testing.
Before installing this update, I highly recommend that all customers backup their data first.
I’m hoping there won’t be any issues, but given the nature of what has been done, it wouldn’t surprise me.
If you do find issues, please contact me using the email at the front of the manual and we will work together to get it resolved!
Other changes included the incorporation of a new enterprise level logging system:
Logging got added to facilitate the testing of the new filing system. It’s needed because so much now happens behind the scenes that this is the only reliable way to see what’s going on.
These log files are rolling log files, so they will never grow out of control. Once they reach their maximum size, the oldest entries are removed to create enough space for the new ones.
The above log is the standard log, but the system also outputs a much more detailed developers log for when Sojour is run from Visual Studio.
These logs are now included in Sojour’s exception windows if, heaven forbid, Sojour crashes:
This should enable me to more easily fault find customer issues.
With the inclusion of the robust filing system and logging, I’m starting to feel that Sojour has crossed that boundary from a bedroom project to a full-on enterprise application!
What else got changed?
There is now a new splash screen:
This was added because the new filing system is now asynchronous. This results in the user interface loading up its various elements in real-time, which is somewhat disconcerting. The splash screen was added to hide this behaviour.
The rendering loop of Ionian – Sojour’s graphics engine also got re-written to take into account the fact that asynchronous file operations can make Sojour look less busy than it actually is. This can result in the graphics engine unintentionally hogging all the resources as it thinks Sojour is idling.
Various additional bugs were also fixed with the character health bars. These were all extreme corner cases. I only found these issues thanks to the new automated integration tests I wrote for this sub-system:
These tests should help prevent a re-occurrence of the emergency fixes that plagued the 1.5 releases.
The other big fix that got included in this release, was in and around how Sojour remembers its windows positions in a multi-monitor environment. There was a bug that prevented the windows being restored to the correct monitors. This should now be fixed – I say should, because the most monitors I could test this on was just two.
The video below provides a much more in depth explanation with regard to the new filing system. I’d encourage all customers to watch it!
That’s it for this release!
Have Fun!
RobP
Sorry for the continued hassles!
This is yet another hot fix to fix yet another health bar issue.
In this case, the fix was mostly focused around auto-dice rolled NPC characteristics – the ones that auto-roll when an NPC is dropped on the map.
Also fixed another bug in and around index calculations for characteristic bars too.
Why so many hotfixes?
v1.5.x.x includes additional code to do really aggressive caching of the health-bar graphics. The intent is to vastly reduce the number of times the health-bar graphics need to be recalculated.
Alas, the caching was way too aggressive and it wasn’t updating the health bars when it really should be!
There is most definitely a lesson to be learned here and characteristics are now going to get targeted for some new automated integration tests to try and reduce this risk in the future.
All customers on v1.5.x.x should upgrade!
Sorry for the constant updates!
Have Fun!
RobP
Howdy folks!
This tiny release fixes an issue where tokens dragged off of the token palette to the map were not showing their health-bars.
I recommend that all 1.5.X.X users switch to 1.5.3.0 – this issue does not affect 1.4.x.x versions.
You can download from the usual place in your Drive-Thru RPG library 🙂
Have fun!
RobP