For about 3 or so years, I've been working on and off (mostly off) on a railroad signaling simulator. I am pleased to say that I am releasing version 1 to the wild. Now this isn't a train simulator, or even a dispatching simulator. It only simulates the progression of train signals as trains operate along a section of track. This is primarily written from a north American perspective. Basic worldwide signaling should be possible, however some systems have some key signaling features that are not included in this such as approach-release.
I primarily wrote this as an eventual means of improving model railroad signaling. Every signaling scheme I could find almost requires programming each and every signal individually, and using lots of if-else logic. As a programmer, that made my hair hurt for multiple reasons so I set out to find a better way. Essentially, I use arrays and numerical signal indications to run the logic. So rather than something like:
if(next_indication == 30 && !block_occupied) //receive clear signal, display clear signal indication = 30; elseif(next_indication == 20 && !block_occupied) //receive approach signal, display clear signal indication = 30; elseif(next_indication == 0 && !block_occupied) //receive stop signal, display approach signal indication = 20;
I do something like this:
indication = indications[next_indication];
Additionally, signaling is defined in a set of signal rules that is much more user-friendly, and able to be reused by any similar signals (i.e. all intermediate signals will have the same reactions, on a certain line all passing siding signals will have the same reactions, etc.).
To run, download the .zip file at the link, extract it, and follow the instructions in the manual. That's really it, I'm just trying to share my efforts with the railfan community. So, here it is. If there's any questions or comments, please let me know!
P.S. Yes, the wording here is identical to a post I'm making on another forum, there's just no reason to change the wording for the same piece of software.