Q2PRO-XQ2PRO-X websiteContentsRUEN
II. Developing the Client

Traces of Battle and the Cost of a Beautiful Frame

Late August–10 October 2026 · Q2PRO-X 1.6 in development

After Q2PRO-X 1.5, attention turned to impact marks. A stain on a wall stayed where the shot had hit; a wound on a moving model travelled with it. Player Contact Effects brought together blood, spray, the effects of sustained fire, bodies after death and a separate treatment for BFG impacts. The server still determined damage. The client assembled the visible battle from the events it received.

One hit could leave two stains. The client displayed a predicted effect, then received confirmation over the network and treated it as a new attack. Merging events too broadly caused the opposite problem: a real subsequent hit disappeared. The system began retaining the origin of evidence and matching confirmations. Entity numbers also needed care: an old wound could not be transferred to a new player who inherited a freed number.

A stain on a floor and a wound on a character need different coordinates. The first belongs to a level surface; the second must be attached to animated geometry. MD2 stores sequences of vertex frames, while MD5 uses a skeleton and weights. An approximate shell suitable for one format could slide or flicker on the other. Highlighting and control of model parts developed alongside this work: colouring a head, torso or another region had to match the actual pose, not an assumed shape. Testing covered moving players, their weapons, shadows and reflections.

Highlighting and model parts. A separate colour setting depended on geometry, animation, model-format support and several rendering paths.
Highlighting and model parts. A separate colour setting depended on geometry, animation, model-format support and several rendering paths.

Player and item highlighting had existed since spring. Now it passed through more graphics layers: translucent colour could unexpectedly become solid; texture remained in one mode and disappeared in another. A screenshot could expose incorrect blending. Flicker was harder: sequences of frames had to be recorded and compared against model pose, depth and drawing order.

Blood on walls, water and AVFX puddles had different destination surfaces. Choosing the wrong floor left a stain in mid-air; an incorrect pool boundary spread it onto dry stone. Marks were checked on moving elements and in rooms temporarily out of view. Separate presets and settings slots let contact effects change while preserving the rest of a scene. The player's own blood was adjusted so it did not obscure the fight.

Stalls When the Camera Turned

By autumn, a high FPS figure no longer adequately described the client's speed. Brick geometry could render quickly for a long time, then unexpectedly rebuild as the camera turned. The cache discarded recently used data; looking back forced it to be built again. A diagnostic run counted 329 builds and 320 evictions, with individual delays approaching half a second. Making one operation faster would not solve the main problem: expensive preparation kept returning inside gameplay frames.

Volumetric brickwork in Q2PRO-X 1.6: projecting bricks and recessed joints give the wall depth. Preparing this geometry became one of the tasks of the autumn optimisation work.
Volumetric brickwork in Q2PRO-X 1.6: projecting bricks and recessed joints give the wall depth. Preparing this geometry became one of the tasks of the autumn optimisation work.

Stable data began to be prepared at map load or when a setting changed. Camera turns no longer continually rebuilt bricks, but the cache occupied about 1.7 GB on one demanding test map and 3.3 GB on another. Initial preparation had not disappeared either. The gain was in removing it from ordinary movement; smoother frames were paid for with memory and waiting before play.

Reflections exposed another source of unnecessary work. The world was rendered again for several planes, with complex skies calculated before walls that subsequently covered them. Drawing the sky moved behind opaque geometry, using the depth already available. In the heaviest measured case, the improvement was only from 43.6 to 44.6 frames per second. There was less wasted computation, but the reflected world remained expensive. Other effect combinations continued to be tested separately.

Autumn scenery served both as a distinctive look and as a demanding measurement case. Weather was allowed to reach the same state before comparisons.
Autumn scenery served both as a distinctive look and as a demanding measurement case. Weather was allowed to reach the same state before comparisons.

An autumn preset helped test the rejection of invisible work. Skipping what the camera cannot see is useful; stopping puddles from developing there is a bug. Rain must keep filling them without an observer. Separating world state from its presentation raised the average frame rate in one controlled, demanding scenario from 75.5 to 86 FPS, roughly fourteen per cent. Comparisons included the same wait in rain, tens of thousands of variants and frame checks. Runs that lost focus or activated the screensaver were excluded: they were not measuring the intended comparison.

The current Q2PRO-X 1.6 line continued work on particles, lighting, reflections, vegetation and seasonal materials. Performance HUD showed their cost, while render scale and post-processing helped tune the load. On 10 October, the version was still developing. Meanwhile, another kind of testing had appeared: instead of comparing frames, it required rewatching matches and asking why a new computer opponent had lost.

Effects, Individually

Q2PRO-X 1.6 divided ordinary particles into 68 Standard families. Blood, blaster trails, rocket smoke, sparks, teleports and railgun particles could be enabled, disabled and coloured independently. Ten ordinary AVFX families gained settings of their own: changing a standard weapon trail should not quietly recolour the atmosphere. Sky meteors, falling meteors and comets retained separate colour choices—they are different phenomena, even if each leaves a luminous trail.

Lighting and object visibility gained their own presets. Gameplay choices included bright, saturated, monochrome and ‘Nothing Extra’ looks, with separate lighting choices for AVFX. Such a preset did not enable rain or plants on the user's behalf; it set lighting conditions. Model highlighting, individual parts and ordinary bloom were saved in their own set. The atmosphere could change without losing the carefully chosen readability of an opponent.

Optional health-and-armour music ambience also appeared. Nine states tied the background music's mood to the player's protection, with crossfaded transitions. Single-player and deathmatch were enabled separately, and an explicitly selected online track or music preset took precedence. It offered another way to feel the character's condition, not another source of information about opponents.

Users could replace audio assets and intro music. Custom intro tracks required neither rebuilding the client nor using factory filenames: language-specific FLAC collections were supported, with duration taken from the file itself. If no suitable music existed, the visual intro remained. Packaging details belonged in the guide; what mattered to players was that their chosen appearance did not have to sound exactly as the release authors intended.

A small but useful addition retained the history of successful connections. Shared across mods, it let people return to the last server after restarting, or reconnect automatically if desired. Failed attempts and mere ping refreshes did not clutter it. Such a feature is easy to overlook beside complex graphics, though it shortens the journey from launching the client to playing every day.

Q2PRO-X contact effects connect lighting and particles with events in combat.
Q2PRO-X contact effects connect lighting and particles with events in combat.

Download the book in PDF