Ok, I have come up with a pleasant way of making a thick server design work elegantly while maintaining the clients ability to run independent of any server. In doom, everything is driven by the ticker procedures which are invoked with each loop. This is a bad design as it lends itself to separation of subsystems, but if used properly, it could redefine how the engine functions. Read this chat log (between me and a friend who is developing an engine, about the design I've been thinking of using)
<Zorro> basically you have the self-sufficient gamestate (not self-modifying), then a dynamic and modify-able list of 'tickers' which either modify it or use it to preform tasks such as rendering
<Zorro> the difference between a client and server can be determined by the list of tickers running
<Zorro> I'm not sure if that's been done or not, but it seems like a nice idea
<Zorro> in theory, you could add a ticker which would implement additioinal gameplay features (such as CTF or whatever) through dynamic linkage, or put the game logic ticker in it's own library
The gamestate would define where instances of what object can be found, the state of the map, and any other variables that contain information that other tickers will need (for example, screen resolution, which would be set by either the console or the menu tickers, but used by the renderer.
Tickers truly would act as modifyers applied to the state. For example, in a local game, first would come the input ticker which would post events to a buffer, then the game logic ticker, which would use that information, then the sound ticker, then the render ticker.
Tickers should depend only on the gamestate, never on each other (in the finished product). By being independent, problems are isolated and modifications are no longer engine hacks.
As I said, by using different tickers, you can get different behavior. This will make the code we write higly valuable and reusable.
Local Client:
*Input
*game logic
*sound
*renderer
Remote Client:
*Input
*game logic
*client network tic
*sound
*renderer
Host Client:
*Input
*game logic
*server network tic
*sound
*renderer
Dedicated Server:
*game logic
*server network tic