I'm curious, how and where did you learn to build the Quake 3 game engine in C++?
I ask because I can already program professionally in many languages but building a game engine isn't simply an easy feat.
Also OP, I'm assuming your other half isn't planning on spending any money learning to program? The best learning resources cost money unfortunately.
I started with tutorials at NeHe for OpenGL. There was also a website flipcode that had tutorials and a forum, there were others as well.
A 3D game engine (graphics and physics) is not that hard. OpenGL is very easy to render textured triangles with blended textures. The core of an engine is typically a scene graph with spatial partitioning. I started with simple quad and oct trees (split the world into 8 cubes recursively to a set of leaf nodes with only. Few objects), moved on to KD-trees and BSP trees. These data structures are very common in any dimensional data set where spatial relationships are important. This spar tion allows you to rapidly find out what items (walls, enemies, ammo boxes etc.) are visible and you basically send all that to the rendering pipeline.
At this time static lighting was the norm and you would pre calculate lightmaps. Basically you placed lights in the environ,net and for every wall or ceiling polygon you would run a simple illumination simulation. The illumination at a point p is proportional to the inverse square of the distance times the cosine of the angle of incidence summed over all lights (As a simple approximation). You then get these texture which you just blend with the base texture to get lighting.
Quakes dynamic lights were just done using making a sort of animation with multiple light maps. Quake 3 also had a few fancy things like bezoar splines to make smooth curved surface, again mostly just a little math and not too complex
The collision detection is just math. You use the same spatial partitioning scene graph to find proximal objects. Finding the intersection of a sphere or cylinder against a triangle is quite easy. This math gives a set of 'reflection' vectors for each triangle, which you sum to find the exit trajectory (imagine a billiard ball hitting off the cushion, the output vector is just a reflection of the incident vector minus a portion lost due to friction)
Basic Newtonian physics isn't hard to code but I did move onto using the ODE . E.g. F=ma (brut in 3D)
Sound I just used a sound library like openAL
The hardest thing was getting any kind of media and especially media or 3D models. This is where quake 3 was popular because the levels were easy to read (and there were available level editors) and the graphics were easy to use.
There were lots of easy tricks used at this time. The bullet holes/decals were just another texture layer for example. The reflective floors just involve rendering the world upside down, rendering the floor with some transparency and then rendering the world the right way up. Similar tricks for mirrors and puddles.
I kind of stopped when I was 18 and went to uni (too busy and too interested in girls and beer) but by then my engine looked identical to quake 3 and felt very similar in movement (but would get jammed way too often). It was also like 10x slower, had plenty of glitches and would crash really often. No characters/AI/animation.
I made plenty Of other engines. I loved making open world landscapes, these are actually dead easy. I always got excited about new idea, would stop what I was doing and start new. I had an unreal type engine, a flight sim, star wars game.
I really wish I had the time energy to do this now but it really takes a load of time and there is no way 1 person can make anything close to a modern games unlike when I was a teen in could get very close to a game a couple of years old. One could use a premade game engine but then you would miss out all of the fun and useful exercises Indeveloping your own data structures and algorithms.