BrickUsingMultipleModules (short: *BUMM*) is a riddle game themed around bomb defusals. After an evening of playing Keep talking and nobody explodes, I was sure that this had to be transferred to hardware. The goal of defusing multiple modules is the same, but the hardware implementation calls for some serious changes. Cutting wires was out of the question, since nobody was found to replace them for a new round. Maybe someone will build a robot arm for that in the future.
Basic test video
Each module has its own arduino and is connected to a parallel bus backplane (speaking 5V UART at 19200 baud). Each module contains its own logic and only tells the gamemaster whether it has been defused and if any manipulations (mistakes) were detected.
The gamemaster is a Raspberry Pi running a python script. Apart from the game logic and audio output, it opens a TCP socket which can be used to control the game remotely. The network protocol is based on tree structures serialized to JSON and terminated with NULL.
All lookuptables and manuals are generated completely automatic from config files using python and make.
All material, be it gamemaster scripts, arduino code, *.tex for manuals or svg files for lasercutting are available on github.
The gates module has 7 LEDs, 4 toggle switches and a push button (looking like a switch). Depending on the status of the LEDs, the toggle switches have to be set correctly, then the RUN button has to be pressed. There are two instances of the manual, which both evaluate to the same instructions. The one which gave the module its name has a big network of binary NAND/NOR gates which take the LEDs as inputs and give output levels that correspond to the switch states. For the less nerdy players, there is a second manual, which lists a lot of rules which reference other rules depending on the LED state.
A random gate network is generated using python and visualized using PyGraphViz. Then all possible outcomes are calculated and placed in a big lookup table, which is stored on the arduino. The rules are created by reading the lookup table and pruning. Higher difficulties are achieved by creating larger networks, which depend on more LED states.
The blink module has a red and a green LED, which blink in a specific pattern. Depending on this pattern, a push button below either the red or green LED has to be pressed. Correct solutions are taken from a lookup table (both on the arduino and in the manual). Higher difficulties require multiple iterations and increase the blink frequency and pattern length (and therefore lookup table size).