QuakeC

Published September 03, 2007
Advertisement
This journal hasn't been updated for a while, I know. That doesn't mean that work on the Quake project has dried up - on the contrary, a fair amount of head-way has been made!



The problem is that screenshots like the above are really not very interesting at all. [rolleyes]

As far as I can tell, Quake's entity data (at runtime) is stored in a different chunk of memory to the memory used for global variables. I've had numerous problems getting the code to work - most of which caused by pointer confusion. Four bytes are generally used for a field (vectors use three singles, so you have 12 bytes), so I've tried multiplying and dividing offsets by four to try and get it all to work.

The basic entity data is stored in the .bsp file. It takes the following form:

{"worldtype" "2""sounds" "6""classname" "worldspawn""wad" "gfx/base.wad""message" "the Slipgate Complex"}{"classname" "info_player_start""origin" "480 -352 88""angle" "90"}{"classname" "light""origin" "480 96 168""light" "250"}


classname describes the type of the entity, and the other key-value pairs are used to adjust the entity's properties. All entities share the same set of fields, which are declared in a special section of the progs.dat file.

For each classname there is a matching QuakeC function. As far as I can tell the trick is to decode an entity then invoke its QuakeC method.

void() light ={	if (!self.targetname)	{	// inert light		remove(self);		return;	}	if (self.style >= 32)	{		self.use = light_use;		if (self.spawnflags & START_OFF)			lightstyle(self.style, "a");		else			lightstyle(self.style, "m");	}};


As you can probably guess, if a light entity is not attached to a particular target it is automatically removed from the world as it serves no useful function (the lightmaps are prerendered, after all). A similar example comes from the monsters which remove themselves if deathmatch is set. The QuakeC code also contains instructions on setting which model file to use for each entity and declares the animation frame sequences, so is pretty important to get working. [smile]

I have a variety of directories stuffed with images on my website, and (thankfully) I have used a faintly sane naming convention for some of these. I knocked together a PHP script which reads the files from these directories and creates a nifty sort of gallery. It automatically generates thumbnails and is quite fast. As I don't have an internet connection at home it's more practical to be able to just drop files into a directory and have the thing automatically update rather than spend time updating a database.

PHP source code (requires GD).

It's INI file driven. The two files are config.ini:

[Site]base_dir=../../ ; Base directory of the site; I put this in bin/gallery, so need to go up two levels :)[Files]valid_extensions=jpg,gif,png ; Only three that are supported[Thumbnails]max_width=320max_height=256quality=90 ; Thumbnail JPEG quality


...and galleries.ini:

[VB6 Terrain]key=te                 ; Used in gallery=xyz parameterpath=projects/te       ; Image location, relative to base_dirdate_format=ddmmyyyyi  ; Filename format, where i = index.[MDX DOOM]key=doompath=images/doomignore_extensions=jpg     ; Can be used to ignore extensions.date_format=yyyy.mm.dd.ii


The index in the date format is for files that fall on the same date. Historically I used a single letter (01012003a, 01012003b), currently I use a two-digit integer (2003.01.01.01).

If a text file with the name of the image + ".txt" is found, that is used as a caption. (eg, /images/quake/2003.01.01.01.png and /images/quake/2003.01.01.01.png.txt).

It's not designed to be bullet-proof (and was written very very quickly) but someone might find it a useful base to work on. [smile]
0 likes 0 comments

Comments

Nobody has left a comment. You can be the first!
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Advertisement