You are browsing as a guest. Sign up (or log in) to start making projects!

althotdev

@althotdev

Joined June 22nd, 2026

  • 2Devlogs
  • 3Projects
  • 0Ships
  • 0Votes
C++ developer, went to NorthSec once.
Open comments for this post

2h 31m 11s logged

Writing a tool for web-based puzzles part. 1 : The Need

I have yet again gained interest in playing web-based puzzle games. I recently rediscovered Joey Muller’s 2014 Not The Future, which is one of the easier ones(except for the Super Hard Mode) and decided to move on to the big scary boss: David Münnich’s 2004 notpr0n, from the same David Münnich who released Supraland. How scary is it? Well, in 2015, Clinton Nguyen at VICE (of course it’s VICE) reported that only 34 people have ever beaten notpr0n. And frankly? Understandable. It is 140 levels long, requires obscure trivia and requires to be quite knowledgeable about computers too. There does exist one or two complete walkthroughs, but most of the answer lists you’ll find only cover up to about 10 levels. I’ve only decided to tackle it because Not The Future’s super hard mode has for its first level a hint that the answer is linked to notpr0n level 66.

What would be useful for a game like this?

I’d quite appreciate having a tool with which I could take notes on my current playthrough, including branching paths. I’d also appreciate it if I was able to go back to where I was, with it automatically entering the password I had found for the puzzle.

About branching paths, I do not think notpr0n uses them, but I know for a fact Not The Future does. Slight spoiler: it calls them simulations, which are linear and you receive a password at the end to write down. It would be useful to know what the password for a given branch is, or to have notes about what resources I might have used during the solve of a branch so that I can maybe reuse them for another puzzle.

The best way to go about branching paths is a tree, where you have a root point which has children points who themselves have children points. This can go down an infinite amount of layers, or rather as many layers as your RAM and swap will allow.

Also, notpr0n has some challenges like Not The Future where the goal is to find another URL, but it also has a lot of challenges where you need to enter a username and a password. The way these work is with HTTP authentication, and these can be nicely automated by this structure:

https://USERNAME:[email protected]/example

What I decided to make

Meet Ariadne. Ariadne is basically a way to take notes about what you’re doing in a tree. It relies on raylib for windowing and inputs and ImGui for, well, GUI. It has two keyboard shortcuts: Ctrl+Shift+R to reset the layout, Escape to unselect the current step you’ve selected. It’ll also feature Ctrl+O and Ctrl+S, but that’s for the next devlog. It can already load XML files with pugixml, but it can’t save them yet.

What is(n’t) implemented

You can navigate a tree and write some stuff in. The XML for one step is this:

<step name="" url="" description="" username="" password=""></step>

and it can contain other steps to form a tree of paths to take. Unfortunately, you can neither save your progress to a file or choose a specific file yet, so it isn’t really usable. The example XML provided in the repo is an incomplete but very spoilery map of Not The Future. It also doesn’t have much in the way of customization, but custom colors and fonts will probably soon come as well.

Is it portable?

I develop on Windows and I don’t really have a chance to test on things like Macs, but as far as I can tell, all specifics here are abstracted by the libraries I’m using. Presumably, yes. Will there be builds for those platforms? Probably not.

0
0
1
Open comments for this post

2h 17m 8s logged

Finding a valid DVD

I am currently working on a tool to play DVDs over the network. Technically, VLC already does that, but what I would like is something like Plex, but that can play movies from a selection, but from the files of a DVD so that I can access menus and extras.

What makes a valid DVD?

A valid DVD, in the real specifications, is basically an ISO-9660 file system that contains an AUDIO_TS directory, usually empty for we are talking about DVD-Video and not DVD-Audio, and a VIDEO_TS directory that contiguously contains VIDEO_TS.IFO along with its backup, VIDEO_TS.BUP, followed by a VOB video file for the menu, VIDEO_TS.VOB, then contains title sets, noted as an IFO VTS_xx_0.IFO with its backup VTS_xx_0.BUP and its VOB parts, VTS_xx_0.VOB up to VTS_xx_n.VOB where xx is the numerical identifier to the title set and n is the part of the current title set, understanding that xx starts at 01 because 00 is VIDEO_TS.VOB and n starts at 0, considering that VOB files are naught but MPEG-2 videos part of a subset of the MPEG-2 specifications where all VOB files are valid MPEG-2 videos but not all MPEG-2 videos are valid VOB files.

A valid DVD, as far as nethomevideo has to concern itself, is a directory that contains a VIDEO_TS directory that contains a valid VIDEO_TS.IFO file.

An IFO file is a long data structure that contains a plethora of fields that range from very useful for nethomevideo, such as the number of title sets on a DVD, to incredibly futile such as the Provider ID, which would be useful if distributors actually filled it out. The problem with IFO files is that pretty much all fields change meaning depending on whether it is a VMG or video manager IFO or a VTS or video title set IFO. For instance, at offset 0x00C4, you’ll find a sector pointer to the table of titles in VIDEO_TS.IFO which is a VMG IFO, but the start sector of the title VOB in a VTS IFO. The pointer to the table of titles and chapter in a VTS IFO is at 0x00C8, which is a sector pointer to the menu program chain in the VMG IFO.

The way you differentiate a VTS IFO from a VMG IFO is easy: look at the first 12 bytes. Any IFO file starts with DVDVIDEO-, and then three characters, either VMG or VTS.

What does nethomevideo check for?

As of now, all that nethomevideo does is verify that the directory you have given is actually a DVD and then load its number of title sets from the VMG IFO.

Beyond checking that the given directory to a DVD file is actually a directory that exists, it checks for a VIDEO_TS directory in the given path, otherwise it throws some lovely exceptions from the Standard Template Library. It then proceeds to check if a VMG IFO exists, otherwise it again throws some even lovelier exceptions from the Standard Template Library. Then it checks for an optional AUDIO_TS directory in the root of the DVD.

What I’ll have to implement next

I’d first like to move the logic that loads the IFO file to get the title set count of the DVD to a new function to load any type of IFO that would ideally return a struct containing all fields of the IFO along with the type of IFO. Field names change between VMG and VTS IFO files but their sizes and quantity stay the same lest they are straight up left blank and unused. My main goal for now is to get to actually writing an interpreter for the Interaction Machine, basically the DVD menu bytecode. It will probably run on the server-side using client-side inputs, which given it’ll run on LAN and not over WAN, tunnels or anything like that, lest it’s a demo, should probably be fine for latency. Although, given actual input latency on a real player, it’d probably be just like the real thing. After that, it’ll be a matter of putting all that logic inside of a reusable class that I can instanciate for any new movie session. If all goes to plan, at least.

0
0
10

Followers

Loading…