You asked for it, but this will likely rank up there with one of the longest posts. I can get long winded when I write, I guess it has to do with my typing speed. I've removed a few things that were on other topics related to development and added and clarified a couple of items, so Wolfmarsh, you should read this again. So, you asked for it . . .
I Like the concept of two different types of ball balls. Given the idea that only one or the other type is in play, you will have to figure out how the locked balls fit into your scheme, your trough management needs to know where they are regardless, so you could either just dump them, with the flippers disabled to clear the locked balls or you can leave them alone, and know that the rest of the balls are in the trough. Either way you end up with two troughs to manage, since you need to know where both sets of balls are, but not is not that different from managing a multiball trough (or physical locks) in addition to the main trough. However, since the balls are 'different', I take back what I said, it probably would be a good idea to dump locked balls, otherwise you will need more code around managing the locking and saucers (more on that later). So, having said that, I would dump those locked balls. You also have to keep track of balls locks earned and achieved, since you need to carry that across players, unless you are letting them steal locks.
The root of my comment was around that fact that many of us have experienced a game with a bad trough opto, and how the game will do all sorts of odd things, like put two balls in to play, since it is confused on where the balls are. So keeping accurate count of where all the balls are, is pretty key to game logic. In general a lot of switches if they fail to register will have minor impacts on a game, but switches involved of knowing where balls are are critical.
'Trough management', is something that took some effort to get right. I started with the code in the Procgame framework, and the modified it. I know Eric on CCC did the same thing, but I think he gutted it even more.
The management of the trough and multiball are tightly linked. I keep track of balls in play, based on increasing a counter when I put one in play or at the start of mulitball where it gets increased whether locked balls are being released or balls are going to be put into play via the trough/autofire. That can be a little tricky too, since as balls roll down troughs (either type), it will trigger code to evaluate where the balls are. I'll come back to this in a minute.
On a drain (or a ball going into the ball lock trough) I figure out where all the balls are (main trough, multiball trough/locks) and see how that compares to the number of balls in play, and take action accordingly. The timing on some of this is key, as the balls roll through either trough it will re-trigger code for evaluating the ball counts, so knowing that the game is in the 'start of multiball' was key vs in mulitball or not in multiball, especially if a ball drains while the balls are still being kicked out, with your saucers this will be less of an issue. In general, on those switches I use a delay before doing the analysis. Each switch hit will then restart the delay counter, so as a ball rolls down the trough, the clock resets until it has reached its destination. If mulitball is running, I just kick out anything that hits the MB trough with little to no delay, like I image you will be doing with the saucers, unless you are doing a jackboot based on re-locking the balls within some time frame, which can be a cool feature (ala I500).
As a side note, the opto closest to the drain, not the shooter, is the one I watch to see if a ball has drained in the main trough. As I said I then pause for a couple hundred milliseconds, before 'analyzing', giving the ball time to get down the trough and for the balls to settle (a bigger issue with mechanical switches). As I indicated, for the MB trough I reset that timer if other trough switches trigger, since the design of that trough (ending in a saucer) requires some time for the ball to settle down on the switch. If I do the analysis too quickly I can get an incorrect read on the number of balls in the MB trough.
On a drain event I check if multiball is running and how many balls are still in play (validating ball counts in troughs, locks, etc), this check will then result in removing this from the count of balls in play, e.g. 6 balls in machine, 4 in main trough, none locked, 3 supposed to be in play, but four accounted for so only two are in play, so one must of drained, so now adjust to be 2 in play. Now figure out what the new situation is, if multiball was running and now only one ball is in play, do the end of multiball processing, if more then one still in play, ignore it (well, unless ball save is active, which adds some other complexity), or is this the last ball that was in play, so now do end of ball stuff.
Ball saves also have to be handled whether for the start of a new ball or start of Multiball. If you support a quick launch ball save (e.g. when a ball hits an outlane switch you serve up the saved ball immediately vs waiting for the drain), that then adds a touch more complexity, since when you go to do your math, that ball is not in the trough. Basically I'll just put a ball from the trough into play, and then when the ball that was coming down the lane hits the trough, the system will do its math and decide, there should be one ball in play, and there is still one ball in play, so life is good.
A ball save is basically a timer, so the code checks if save is currently enabled, and if so, if the number of balls in play is less then what the ball save object was told to 'keep in play',then it serves it back out. Ball save can have two attributes really, how long the save is active and the maximum numbers of balls to save, which typical applies to MB as either just the first drain, up to X times, or for the given time frame (I do the latter).
Oh, one thing I forgot to mention to wolfmarsh, is you also have to handle a ball falling back into the trough, you don't want that to be viewed as a drain. IN theory it should hit the 7th opto, but since it can push the balls and back and trigger the opto closest to the drain, you have to know this was a fall back. This is one of the things that brings the shooter lane into the trough management equation, more on that in a moment.
Ball locking is tied to trough management. If a ball enters a lock, you have to decide should it be locked (e.g. was the lock lit), or kicked out, if it is a lock should a new ball be put into play from the main trough, the multiball trough e.g. this is the third ball in the trough, but only two locks earned, so need to remove one to leave space for another lock, or in your case, potentially unlocking a ball in a different saucer, or does mulitball need to be started.
The shooter lane switch is also tied to trough management. First off, if there is ball in the shooter lane, you don't want to serve up another ball. This is primarily an issue with MB when you are serving up a bunch of balls from the trough. The shooter lane in my case, during game play, also monitors if a ball has somehow found its way back there and will auto fire it out, but you don't want that active until your balls save as timed out and your are not in MB or at least I don't, I want to let the user still have control of that plunge. Also the 'opening' of the shooter lane switch is when you start the ball save timer. The closing of the shooter lane switch is also important, since that is how you know the ball made it out of the trough correctly, and how you then would deal with a fall back, e.g. you serve a ball, but if the shoot switch did not trigger, then you need to know that if a ball drains, so not to treat it as a drain, but more like a ball save, but a save that does not end the ball save, in theory we have not started the skill timer yet, or the ball save timer, since that happens after the shooter switch opens, so if ball save active and timer not started, then ball never reached the shooter lane.
So, by now you have a headache, and realize that this is a little more complicated then you first thought.