How good a game is really depends on how modular and organised your game engine is. If you have a good game engine where you can easily add/remove levels, add/remove entities in each level, create characters, create enemies, create weapons, have descent scripting fascilities, then you have something ready. Once you have that, there is really no limit to where you can go with it, unless you have a limiting engine.
I tend to start off making the basic UDTs, like 3d vectors, maybe for levels, perhaps weapons, but maybe not yet. I also ofcourse make all my standard basic functions, that will be essential to the engine, like freeObject() and freeImage().