
This is the last major component of the quake utilities to be released.  
To be honest, I have been a little reticent to release this because most 
of the actual qc code is basically rather embarassing crap.  The time 
never became available to even give it a good top to bottom going over.  
I never spent any quality engineering time on my parts, American wrote a 
lot of qc code, and even Romero has a bit of work in there.  It is a mess.  
If you look through the code and occasionally think "This is stupid!", you 
are probably right...

The compiler itself can be drastically sped up by just replacing the 
symbol searches with binary trees or hashing.  We remotely compile on 
our alpha, so it hasn't been a big enough issue for me to do it, but as 
the code size grows and grows it will be done sooner or later.

The resulting code is horribly nieve and space ineficient (twleve bytes / 
instruction).  If common subexpression removal was added, the instruction 
count could probably be cut nearly in half.  I would have liked to have 
done a better job at this, but this was my first compiler front end, and 
I had a ton of other things fighting for my time.  The next one will turn 
out better. (wow, I'm making a lot of excuses here, aren't I?)

Qcc also performs some other maintenence functions for us, like rebuildinng 
all the brush models and making pak files, but those functions are only 
usefull if you have created all new data for everything.  models.qc and 
sprites.qc don't actually generate any code, they are just parsed by 
modelgen and spritegen and included for completeness.


To modify the quake program code, set up a new game directory parallel 
with id1, and containing a "progs" subdirectory.  Copy all the .qc files 
and progs.src into that, and just run qcc from that directory.  That will 
compile all of the files listed in progs.src and (if there aren't any 
errors) generate a new progs.dat file in the parent directory.

As a simple test, open the client.qc file, go to the ClientObituary function 
at the end, and change some of the messages.

The directory structure will look something like:

/quake/quake.exe
/quake/id1/
/quake/mygame/progs.dat
/quake/mygame/progs/progs.src
/quake/mygame/progs/world.qc
/quake/mygame/progs/client.qc
/quake/mygame/progs/... etc ...

Run quake with "-game mygame", which will cause quake to look for data in 
the mygame directory before falling back to id1.  In this example, it will 
find the new progs.dat from mygame, and take everything else from id1.  
You can type "path" at the quake console to verify the current search 
order of directories and pak files.  THIS WILL ONLY WORK WITH A REGISTERED 
VERSION OF QUAKE.

The header qcc.h has the language spec and some documentation, but I'm not 
positive if it is all current.

The only documentation for the various builtin functions I can offer is the 
source code used by quake.  See builtin.c.  Some of them are required to do 
things outside the scope of the qc world, and some are just there for speed 
reasons.

PLEASE don't ask me questions about all this!


John Carmack

