Treasure hunt that requires using bash and other command line tools to find the series of clues.
Clues are hidden within the file system which is created via a setup script that will make a bunch of files with secrets hidden in them. We could use just a tar of the scavenger hunt but we want to uniquify the clues so each person has to find their own.
Player starts by running the script start which will build the puzzle (with
new random secrets) and give the player initial instructions.
Thereafter the player uses progress to check their progress and get clues.
That script will run their solution scripts for each step, checking that they
found the correct secret.
Secrets contain random numbers generated when the puzzle is set up and are thus
different every time the scavenger hunt is built. We also store the hash of each
secret in order in the .hashes file when we generate the puzzle. The
progress script uses those hashes to confirm that the player has found the
correct secrets by hashing the secrets found by their scripts comparing against
the corresponding line in .hashes.
When the player has found all the secrets, progress prints an ASCII-art
trophy. Cheaters who hack progress to say they are solving puzzles when they
are not will not get a trophy because it was encryted with all the actual
secrets as a key.
Each step in the hunt is defined by a script that is given the secret for the
next step (so we have to build backwards from the last step to the first) and
hides that clue in some way, generating whatever files are needed in the puzzle
directory and then emits the clue which will be fed to the script for the
preceding step, until we get back to the zeroth step whose clue is stored in
puzzle/.first-clue.
Trivial example:
#!/usr/bin/env bash
# Save the secret we are given into a super secret file
echo "$1" > secret-file.txt
# Print the clue that will be given to the user.
echo "The next secret is in secret-file.txt"The argument to the script will be the secret to hide which will consist of a random number in hex and the clue emitted by the script for the subsequent step.