Blitz and Cipher are VERY different. Knowing that, we are not using Blitz "directly" for prototyping stage of Century. I wrote a custom engine in Blitz3D, which exports a custom set of functions to the scripts we use to code the demo (we use the awesome BlitzVirtualMachine for scripting). The structure of this engine (I call it Lunatic) is very similar to Cipher/Quake architecture.
For example, the set of functions for the scene module are:
;Scene functions
scn_Load(file$)
scn_Render(vp.viewport_t)
scn_LoadModel%(file$)
scn_LoadMaterial%(name$)
scn_LoadParticleSystem%(name$)
scn_LoadLensFlare%(name$)
scn_InsertEntity%()
scn_InsertLensFlare%(flare)
scn_InsertShadowCaster(pos.vec3_t, range#)
scn_RemoveEntity(entid)
scn_RemoveLensFlare(lensflare)
scn_RemoveShadowCaster()
scn_PositionLensFlare(lensflare, pos.vec3_t)
scn_PositionShadowCaster(pos.vec3_t, range#)
If you take a look at Cipher documentation, the functions are very similar. Also, Cipher uses the separate modules for each game component: gamex86.dll is the server (it's almost empty if you are writing a single-player game, but it contains most of the logic code in a multiplayer game), cgamex96.dll contains the client code (in a multiplayer environment, it sends information about current player's state to the server, and updates the entities information when it receives it back from the server, and renders the scene; in a single player environment, it contains the biggest part of your game: game logic, input handling, AI, scene rendering, etc), and uix86.dll handles the user interface (it's called when the engine is initialized, you normally render the menu of the game with this module, and when you have to start the game, you init the client/server components from here).
These dlls in Cipher have an entry point, it is the function main_vm(), which recives an event to tell the modulwe what it has to update: init, shutdown, get version (to ensure that modules version match with the engine), draw frame (and update all game logic), mouse event (also recives data with x and y movement), key event (only for the ui component, the client uses the input by binding keys to some actions in the game console), and console command (a key binding has been pressed, the user has reinitialized the video mode, etc).
We ahve emulated all this functionality in Blitz, using a BlitzVirtualMachine script for each module. There is only ui.bbm and cgame.bbm modules, as we do not use multiplayer for Century.
For example, the main_vm function looks like this in cgame:
Function main_vm(msg.msg_t)
Select msg\id
Case MSG_INIT
cg_Init()
Case MSG_FINISH
cg_Finish()
Case MSG_COMMAND
cg_Command(msg\dat$)
Case MSG_MOUSEEVENT
cg_MouseEvent(msg\args0#, msg\args1#)
Case MSG_DRAWFRAME
cg_DrawFrame(msg\args0#)
End Select
End Function
Then we have a separate function which handles each event.
Why do you want to use Cipher? Is is an OpenGL engine for Windows which requires C knowledge, and it is harder than Blitz. We are using it mainly because it comes with source code. I am modifying the engine a lot to suit our need (the most important is that we want it to be multiplatform, replcaing all the WinAPI/DirectInput calls with SDL, and DirectSound with OpenAL, and we will also add some new features in the future like octree occlusion and physics). If you don't plan to modify Cipher, in it's current state you can do almost everything Cipher does in Blitz3D.