I made some progress, but the next version isn't going to have any special features...
If anyone's wondering, here's how the last version worked, and how the next version will probably work:
V1:
Put simply, the front dial would fire x projectiles to the back brick, which would toggle x events. The back brick would check to make sure that the number on the dial was correct by attempting to cause a printCountOverflow. It would increment 1 either 8 times (if the wrong number was entered) or 10 times (if the right number was entered).
The problem with this is
1: It's slow, because firing a max of 10 projectiles takes at least a second for each dial
2: It uses a lot more events than necessary
V2 will use a binary-type comparison by using a combination of relays and projectiles.
Think of firing a relay as a binary '0' and firing a projectile as a binary '1'. Use 4 'binary digits', and you got 16 different combinations, and only 10 are needed for the lock. That cuts the maximum waiting time in half, offers 6 extra options (if I feel like adding something later), and uses only 4 events (as opposed to 10 with only projectiles).
The problem with adding special features, such as seeing the combination before changing it (phflack's idea) and locking the passcode (forget who suggested it) is that many event types are already being used, and the bricks that check the passcode need to have 'memory'. I'd rather just get this working before I add any special stuff.
Right now, I can make the brick behind the dial convert the combination of relays and projectiles into center prints, so the next step will be to compare the result to the specified passcode.